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;
}
浙公网安备 33010602011771号