10月1日 训练 QAQ
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10月1日 训练 QAQ相关的知识,希望对你有一定的参考价值。
据说这是zld的题
书写比赛
【问题描述】
最近,SZ 在高一各个班级都举行了书写比赛,具体内容是让同学们走上讲台在黑
板上写下几段文字。
现在,你所在的班级有 N 个人,座号分别为 1~N(即给定顺序),每个同学按座号
顺序需要书写 S 段文字。 书写过程中, 每个人的速度是不一样的, 每个同学每个单位的
时间可以书写 Vi 段文字,当一组上讲台的人中最慢的人完成书写,就轮到下一组继续
书写。
不幸的是,老教室的讲台陈年失修,当站在上面的同学的体重大于 W 的时候就会
崩塌。每个同学的重量 Qi 是不同的,每次上台的人的重量和不能超过 W,除非你购买
了平(zhe)安(shou)保险,否则你就要付出巨额赔款。
现在, 你的班主任将这个重要的任务交付给了你, 要求你巧妙地在给定的顺序下安
排分组,在总时间最短的情况下完成书写比赛。如果你成功地做出了这个方案,张璐老
师保证你的班级将会获胜,你也会因此荣获“三好学生”称号。如果你无法制定出这个
方案,你将被要求抄书。
为了降低难度, 善良的 S.C.帮你向张璐老师提出申请只要求你输出最短的时间, 精
确到小数点后两位 (四舍五入)即可。S.C.对你如此友好,你更应该完成这一道题,
不要辜负 S.C.对你的希望。
【输入格式】
第一行,共三个数 W,S,N;
接下来 N 行,按给定顺序,每行两个数 Qi 和 Vi,Vi、Qi 分别是第 i 号同学写
字的速度(段/单位时间)和他的重量。
【输出格式】
仅一行,代表最短的时间,精确到小数点后两位。
【输入 输出样例】
800 300 4
53 5.0
59 3.0
38 2.0
69 2.0
150.00
【数据规模】
对于 20%的数据,有 N ≤ 15;
对于 100%的数据,有 N ≤ 2000 ; W, S ≤ 32767;
本题保证 Q ≤ W。
题解:f[i]表示第1到第i位同学的最小花费时间,易得f[i]=min(f[i],f[j-1]+时间花费)
1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 #include <cmath> 5 #include <string> 6 #include <string.h> 7 #include <numeric> 8 #define gc getchar() 9 #define REM main 10 using namespace std; 11 int q[233333]; 12 double v[2333]; 13 double dp[233333]; 14 int read() 15 { 16 int xxxx=0,fuh=1;char ch=gc; 17 while(!isdigit(ch)){ 18 if(ch==‘-‘)fuh=-1; 19 ch=gc; 20 } 21 while(isdigit(ch)){ 22 xxxx=(xxxx<<3)+(xxxx<<1)+ch-‘0‘;ch=gc; 23 } 24 return xxxx*fuh; 25 } 26 int REM() 27 { 28 cin.sync_with_stdio(false); 29 int w,s,n,i,j; 30 cin>>w>>s>>n; 31 for (i=1;i<=n;i++) 32 { 33 cin>>q[i]>>v[i]; 34 q[i]+=q[i-1]; 35 } 36 for (i=1;i<=n;i++) 37 { 38 double yz=v[i]; 39 dp[i]=s/v[i]+dp[i-1]; 40 for (j=i;j>=1;j--) 41 { 42 yz=min(yz,v[j]); 43 if (q[i]-q[j-1]<=w) 44 dp[i]=min(dp[i],s/yz+dp[j-1]); 45 else break; 46 } 47 } 48 printf("%.2lf",dp[n]); 49 return 0; 50 }
灌水
【问题描述】
学霸 ZLD 是全年段同学 Orz 的对象,ZLD 告诉 S.C.在他小时候他的妈妈带他去
测 IQ,结果显示他的 IQ 只有 70。显然,这只能说明出 IQ 测试题的医生弱爆了,ZLD
大神不屑于去做这种水题。
经过 S.C.的调查,S.C.觉得下面这件事足以证明 ZLD 大神 IQ 的高度:ZLD 小时
候就很勤奋, 小学就已经有了相当的算法水平, 于是他家人决定给他一项艰巨而又有趣
的任务。在 ZLD 的老家有一大片的田,ZLD 要把水灌到他的 N(1≤N≤1000)块农田,
农田被数字 1 到 N 标记。把一块农田进行灌水有两种方法,一是从其他已经有水的农
田引水;另外也可以在这块农田建造水池。在第 i 号农田内建造一个水池需要的花费为
Wi(1≤Wi≤100100),连接两块农田需要花费 Pij(1≤Pij≤100100, Pij=Pji, Pii=0)。ZLD
则要把这 N 片农田灌满水所需的最少费用求出来!
结果自不必说, ZLD 把这个他认为的水题给虐爆了。 那么同样有志向成为神犇的你
是不是也需要这道题来证明自己的实力呢?
【输入格式】
第一行是一个整数 N;
接下来 N 行每行有一个数 Wi;
第 N+2 行到第 2N+1 行每行有 N 个数用空格隔开, 第 N+1+i 行的第 j 个数代表 Pij。
【输出格式】
仅一行,输出最小费用。
【输入 输出样例】
4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
9
【数据规模】
对于 50%的数据,有 N ≤ 500;
对于 100%的数据,有 N ≤ 1000。
题解:我们额外建立一个点,和原有的点连边,边权为点权,然后做一遍最小生成树就好了。
1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 #include <cmath> 5 #include <string> 6 #include <string.h> 7 #include <numeric> 8 #define gc getchar() 9 #define REM main 10 using namespace std; 11 int n,m; 12 int fj[2000]; 13 struct node 14 { 15 int x,y,w; 16 }a[2003]; 17 int father[2001]; 18 int find(int x) 19 { 20 return father[x]==x?x:father[x]=find(father[x]); 21 } 22 int read() 23 { 24 int xxxx=0,fuh=1;char ch=gc; 25 while(!isdigit(ch)){ 26 if(ch==‘-‘)fuh=-1; 27 ch=gc; 28 } 29 while(isdigit(ch)){ 30 xxxx=(xxxx<<3)+(xxxx<<1)+ch-‘0‘;ch=gc; 31 } 32 return xxxx*fuh; 33 } 34 /*int pow4(int a,int b) 35 { 36 int r=1,base=a; 37 while(b!=0) 38 { 39 if(b&1) 40 r*=base; 41 base*=base; 42 b>>=1; 43 } 44 return r; 45 }*/ 46 bool cmp(node zy,node yz) 47 { 48 return zy.w<yz.w; 49 } 50 51 int REM() 52 { 53 54 int flag=0; 55 int i,j; 56 int temp; 57 n=read(); 58 for (i=1;i<=n;i++) 59 fj[i]=read(),father[i]=i; 60 father[n+1]=n+1; 61 for (i=1;i<=n;i++) 62 for (j=1;j<=n;j++) 63 { 64 temp=read(); 65 if (i!=j) 66 { 67 a[++flag].x=i; 68 a[flag].y=j; 69 a[flag].w=temp;} 70 } 71 for (i=1;i<=n;i++) 72 { 73 a[++flag].x=n+1; 74 a[flag].y=i; 75 a[flag].w=fj[i]; 76 } 77 sort(a+1,a+flag+1,cmp); 78 int cnt=0;long long ans=0; 79 for (i=1;i<=flag;i++) 80 { 81 int fx=find(a[i].x); 82 int fy=find(a[i].y); 83 if (fx!=fy) 84 { 85 ans+=a[i].w; 86 cnt++; 87 father[fx]=fy; 88 } 89 if (cnt==n) 90 break; 91 } 92 cout<<ans; 93 return 0; 94 }
礼物
【问题描述】
ZLD 蒟蒻以前只会泡汉子。 现在要开始泡妹子了。 但他不会, 于是他就只好请教小
红如何泡妹子。
由于最近是国庆节,小红收到了他的妹子的 N 个礼物,分别从 1~N 编号,但可恶
的老鼠偷走了其中一个礼物。小红十分生气,他答应只要 ZLD 蒟蒻找到那个丢失的礼
物的编号,他就传授 ZLD 蒟蒻泡妹子绝技。
故事的结局是你帮助 ZLD 蒟蒻找到了礼物的编号,让他学会了如何泡妹子,所以
你必须帮助 ZLD 蒟蒻找到那个丢了的礼物!
【输入格式】
第 1 行为一个正整数 N;
接下来有 N-1 行,每行一个小红现在有的礼物编号。
【输出格式】
一行一个数字,为被可恶的老鼠偷走的礼物编号。
【输入 输出样例】
5
2
3
1
5
4
【数据规模】
对于 30%的数据,满足 N≤500;
对于 100%的数据,满足 N≤1500000。
题解:算出1...n的和,然后一个个减掉就好了。但是这题略坑,北大zld学长给我们开2m内存。。不过不虚。QAQ
1 #include <stdio.h> 2 #define REM main 3 using namespace std; 4 5 int REM() 6 { 7 //freopen("gift.in","r",stdin); 8 //freopen("gift.out","w",stdout); 9 int n; 10 scanf("%d",&n); 11 int i,temp; 12 long long gcy; 13 gcy=((long long)n*(n+1))>>1; 14 for (i=1;i<=n-1;i++) 15 scanf("%d",&temp),gcy-=temp; 16 printf("%lld",gcy); 17 return 0; 18 }
今天题目好水但是我 写 狗 了。。
QAQ
以上是关于10月1日 训练 QAQ的主要内容,如果未能解决你的问题,请参考以下文章