Dsqwwe 一周年模拟赛

背景:

话说 z 同学自从去年某个时候把 zn 追到手,转眼已经一年了,无聊的 z 同学算了算日子, 惊喜的发现快到一周年了,借此出题机会纪念一下。(这套题的描述肯能有些不着调,但都是我精心找的好题,请同学们认真对待)

题号

文件名

输入文件

输出文件

1

go

Go.in

Go.out

2

Test

Test.in

Test.out

3

Help

Help.in

Help.out

4

Jump

Jump.in

jump.out

第一题:行动开始

背景:

话说 z 同学不知什么时候见到 zn 同学就有一些小小的心动,身为 z 同学好兄弟兼下铺的 loongint 同学貌似猜出了什么,无奈的 z 同学只好坦白~~~谁知 loongint 知道了 z 同学的心事 后,告诉了 z 同学一个好消息:hz 将要举办一年一届的高考研讨会,每个班要派出一名男生和一名女生做这次活动的志愿者,410 班报名的女生恰好是 zn 同学,而男生就是与 z 同 学从小长到大的好兄弟 ray,噢噢噢 ,真是天助小 z 也。果然,小 ray 为了兄弟的终身幸福 大事,果断的把志愿者的机会让给了 z 同学。。。。。。

一切都按照 z 同学的计划进行,终于到了高考研讨会的第一天,z 同学决定把他最阳 光、帅气的一面展现出去,哇咔咔

题目描述:(终于到正题了)话说高考研讨会的志愿者真不是什么好活啊,接待客人,打扫卫生,带着客人们找厕所~~~z 同学和 zn 接到一个任务:为远道而来的客人们准备礼品,有 n 组礼品,每组礼品有两种型号 A 和 B,两种型号的礼品价值不同,校长规定,要为客人们从每组的两种型号的礼品中选出一种型号,但是至少有有一组选 A 型号,善良的 zn 想为客人们设计出得到的总价值最大的方案,无奈礼品的组数太多,于是重任落在了 z 同学的肩膀上,请帮帮小 z 吧

输入格式:

第一行 n,为礼品的组数

接下来 n 行,每一行包括两个整数 Ai,Bi

输出:

最大价值(保证结果小于 maxlongint)

样例输入:

3

1 100

50 50

-9 6

样例输出:

156

数据范围:

对于 30%: 0<n<=1000

对于 70% 0<n<=100000

对于 100% 0<n<=30000000

-99999<Ai,Bi<99999

 

#include <cstdio>
int n;
long long min=2000000;
bool flag=false;
long long ans;
int main(){
    freopen("go.in","r",stdin);
    freopen("go.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++){
        long long x,y;
        scanf("%I64d%I64d",&x,&y);
        if (y>x){
                 ans+=y;
                 if (y-x<min) min=y-x;
        }else{
              flag=true;
              ans+=x;
        }
    }
    if (flag) printf("%I64d\n",ans);
    else printf("%I64d\n",ans-min);
    return 0;
}

 

第二题:考验

背景:

话说高考研讨会上有许多志愿者,其中有许多女生,性格开朗、活泼的 zn 很快就与这 些女生打成一片,把 z 同学晾在了一边。现场人很多,小 z 一转眼发现找不到了 zn 一伙人 了,肿么办,计划赶不上变化啊,小 z 找到了志愿者总管:一个带着小红帽的死胖子,死胖 子说了:想知道她在哪啊,听说你是 410 的,听说 410 都是些牛逼人啊,我得考考你。

小 z 心想:考考考,我靠你 LM 啊,MD,要不是 LZ 有急事,早把你办了~!~

题目描述:

死胖子出题了,咱们现在处于 1 区域,zn 处于 2 区域,一共有 n 个区域,有一些路 连接着两个区域,路有长度,死胖子规定一条从 1 到 2 的路径的权值为这条路上每条路长度的最大公约数,他叫你求出所有能从 区域 1 到 2 的路径的权值的最小公倍数(路径上的点最多经过一次)

输入:

第一行:n

接下来是一个 n*n 的矩阵,i 行 j 列的值代表从 i 区域到 j 区域的路径长度,若不连通,

则为 0

输出:

所求的最小公倍数

样例输入:

4

0 0 3 16

0 0 9 6

3 9 0 0

16 6 0 0

样例输出:

6

数据范围:

2<=n<=25

1<路径的权值<2000

Hit: 不用高精度哦

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
struct edge{
       int x,next;
       long long w;
}e[100000];
int k[100];
int v[100];
int tot;
long long ans=1;
void add(int a,int b,int c){
     e[++tot].x=b;
     e[tot].w=c;
     e[tot].next=k[a];
     k[a]=tot;
}
long long gcd(long long a,long long b){
    if (b==0) return a;
    return gcd(b,a % b);
}
void dfs(int x,long long K){
     if (x==2){
               ans=ans*K/gcd(ans,K);
               return;
     }
     if (ans % K==0) return;//强力剪枝 
     for (int t=k[x];t;t=e[t].next){
         if (!v[e[t].x]){
                         v[e[t].x]=true;
                         dfs(e[t].x,gcd(K,e[t].w));
                         v[e[t].x]=false;
         }
     }
}
int main(){
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++){
        for (int j=1;j<=n;j++){
            int x;
            scanf("%d",&x);
            if (x!=0) add(i,j,x);
        }
    }
    v[1]=true;
    for (int t=k[1];t;t=e[t].next){
        dfs(e[t].x,e[t].w);
    }
    printf("%I64d\n",ans);
    return 0;
}

 

第三题:帮忙

背景:

在高考研讨会上,随着 z 同学对 zn 了解的深入,发现她不仅是一个善良的女孩子,还 是一个很勤劳的女生,哇塞,这样棒的女生在21世纪真是太难遇到了,要是可以娶到这样的女生,小 z 陷入了无限的 yy 中

高考研讨会进入了尾声,校长一声令下,搬椅子喽~~~~,只见平时道貌岸然的那些所

谓的好学生们一听要干活全跑了,shit~~!!操场上只剩 zn 与 z 同学了,面对成千上万的椅子, 肿么办~~小 z 突然意识到现在正是奥赛课啊,于是他想到了 hzoi2009的兄弟们,果然,当小 z 跑到机房,说明来意后,hzoi2009的兄弟们(还有个妹子)当时貌似在考试,但都没有半点 迟疑,立马跟随小 z 下楼(小 z 一直把这件事记在心中,现在回想起来还有点小感动哈)

题目描述:

面对成千上万的椅子,当然不能用蛮力一个一个的搬了,校长大人提供了一种搬运车。 椅子们是排成一排的,搬运车一次必须搬不少于k 个的连续的椅子,消耗的机油为所搬椅子重量的平均值(总重量比椅子个数)。小 z 想知道搬一次最多能耗费多少机油,好向校长报销机油费

输入:

第一行:整数 n(代表椅子数)与 k(一次搬的最少的椅子数) 接下来 n 行,每行一个整数 w i,代表椅子的重量

输出:

搬一次可能耗费的最多的机油数*1000(结果取整) 样例输入:

10 6

6

4

2

10

3

8

5

9

4

1

样例输出:

6500

数据范围:

对于30%的数据 0<k<N<=1000

对于100%的数据 0<k<n<100 000

0<Wi<=2000

 

#include <cstdio>
int n,k;
int a[110000];
int sum[110000];
long double ans;
long double G(int i,int j){
       return (sum[i]-sum[j])/(long double)(i-j);
}
int main(){
    freopen("help.in","r",stdin);
    freopen("help.out","w",stdout);
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum[i]=sum[i-1]+a[i];
    }
    int max=0;
    for (int i=0;i<=n-k;i++){
        int j=i+k;
        if (G(j,max)<G(j,i)) max=i;
        if (G(j,max)>ans) ans=G(j,max);
    }
    printf("%d\n",(int)(ans*1000));
    return 0;
}

 

第四题:跳跃

背景:

事情出奇的顺利,自从高考研讨会过后,z 同学专心准备 noip2010 。可能是被 z 同学的 潇洒、帅气、阳关所吸引,zn 主动约到了 z 同学,就这样,zn 与 z 同学走到了一起~!那是 一次放假,众所周知,hz 的放假,对于不回家的同学就是能走出封闭的 hz 大门好好玩上3 个小时。Zn 刚与 z 同学吃完 kfc,他们来到了衡水唯一还算比较浪漫的地方(貌似叫什么人 民公园吧,ms 了~~)。

题目描述:

公园中有许多木桩,每个木桩都有一个高度,活泼的小 z 同学喜欢从一个木桩跳到另 一个木桩上,zn 说太危险了,于是 z 同学让 zn 算出每一次跳跃的危险系数。小 z 每一次跳 跃的范围是一个 k*k 的矩形,危险系数为这个矩形内最高的木桩高度减去最小的。身为 oier, 你能比学数奥的 zn 算的快吗

输入:

第一行三个整数 n(木桩为 n*n 的矩阵)、k、b(小 zz 准备跳跃的次数) 接下来为 n*n 的矩阵,描述木桩的高度

接下来 b 行;每行两个整数 x,y(表示 z 同学跳跃的范围的左上角为第 x 行第 y 列), 保证跳跃范围不超过矩阵的范围

输入:

B 行,每行对应一次跳跃的危险系数样例输入:

5 3 1

5 1 2 6 3 <<------------------第一行

1 3 5 2 7

7 2 4 6 1

9 9 8 6 5

0 6 9 3 9

1 2

样例输出:

5

数据范围:

对于30%的数据

0<k<=n<=250 0<b<=100

对于100%的数据

0<k<-n<=250 0<b<=1000 000

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int f[310][310][11];
int g[310][310][11];
int N,M,K;
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
int log_2(int n){
    int t=0;
    while ((1 << (t+1))<n) t++;
    return t;
}
int main(){
    freopen("jump.in","r",stdin);
    freopen("jump.out","w",stdout);
    memset(f,63,sizeof(f));
    memset(g,0,sizeof(g));
    scanf("%d%d%d",&N,&M,&K);
    for (int i=1;i<=N;i++){
        for (int j=1;j<=N;j++){
            scanf("%d",&f[i][j][0]);
            g[i][j][0]=f[i][j][0];
        }
    }
    int w=log_2(M);
    for (int k=1;k<=w;k++){
        for (int i=1;i<=N;i++){
            for (int j=1;j<=N;j++){
                if (i+(1 << k)-1<=N && j+(1 << k)-1<=N){
                         f[i][j][k]=min(f[i][j][k-1],f[i+(1 << (k-1))][j][k-1]);
                         f[i][j][k]=min(f[i][j][k],f[i][j+(1 << (k-1))][k-1]);
                         f[i][j][k]=min(f[i][j][k],f[i+(1 << (k-1))][j+(1 << (k-1))][k-1]);
                         g[i][j][k]=max(g[i][j][k-1],g[i+(1 << (k-1))][j][k-1]);
                         g[i][j][k]=max(g[i][j][k],g[i][j+(1 << (k-1))][k-1]);
                         g[i][j][k]=max(g[i][j][k],g[i+(1 << (k-1))][j+(1 << (k-1))][k-1]);
                }
            }
        }
    }
    for (int t=1;t<=K;t++){
        int i,j;
        scanf("%d%d",&i,&j);
        int t1=i+M-1;
        int t2=j+M-1;
        int mi,ma;
        mi=min(f[i][j][w],f[t1-(1 << w)+1][t2-(1 << w)+1][w]);
        mi=min(mi,f[i][t2-(1 << w)+1][w]);
        mi=min(mi,f[t1-(1 << w)+1][j][w]);
        ma=max(g[i][j][w],g[t1-(1 << w)+1][t2-(1 << w)+1][w]);
        ma=max(ma,g[i][t2-(1 << w)+1][w]);
        ma=max(ma,g[t1-(1 << w)+1][j][w]);
        printf("%d\n",ma-mi);
    }
    return 0;
}