首页 > 代码库 > 2016年10月1日 训练 QAQ

2016年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 main10 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 }
QAQ

 

灌水

【问题描述】
学霸 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 main10 using namespace std;11 int n,m;12 int fj[2000];13 struct node14 {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 }
qwq

 

礼物

【问题描述】
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 }
23333

今天题目好水但是我  写 狗 了。。

QAQ

 

2016年10月1日 训练 QAQ