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; }