2020年百度之星·程序设计大赛-初赛二 补题/赛后


Title

  • Poker
    • 题解
  • Distance
    • 题解
  • Covid
    • 题解
  • Car
  • Drink
  • Cloth
  • Solo
  • Hanoi

Poker Problem Description
小沃沃在玩一个有趣的游戏。
初始他有 n 块钱,每一轮他需要投入至少 m 块钱,系统会拿走其中 p% 的钱,并把剩下的钱还给他。
请问在最优情况下,小沃沃最多可以玩多少轮?
假设当前一轮小沃沃投入了 x 块钱,那么他可以收回 ?x×(1?p%)? 块钱,其中 ?a? 表示 a 取下整。
小沃沃每一轮投入的钱不能超过他现在拥有的钱。
每一轮投入的钱必须为整数。
Input
第一行一个正整数 test(1≤test≤100000) 表示数据组数。
对于每组数据,一行三个整数 n,m,p(1≤n≤100000,1≤m≤1000,1≤p≤100)。
Output
对每组数据输出一行一个整数表示答案。
Sample Input
2
10 2 50
10 2 100
Sample Output
9
5
题解 模拟
#include #include int main() { int t,n,m,p,cnt; scanf("%d",&t); while(t--) { cnt=0; scanf("%d%d%d",&n,&m,&p); while(n>=m) { n=n-m+ceil(m*(100-p)/100); cnt++; } printf("%d\n",cnt); } return 0; }

Distance Problem Description
小沃沃所在的世界是一个二维平面。他有 n 个朋友,第 i 个朋友距离他的距离为 a[i],小沃沃并不知道这些朋友具体在什么点上。
请问在最优情况下,小沃沃的朋友两两之间的欧几里得距离的和的最小值是几?
假设小沃沃的位置为 P0=(x0,y0),第 i 个朋友的位置为 Pi=(xi,yi),对于所有的 i,需要满足 dist(P0,Pi)=a[i],并且∑n?1i=1∑nj=i+1dist(Pi,Pj) 最小,其中 dist(X,Y) 为连接点 X 和点 Y 的线段的长度。xi,yi 都可以是任意实数。
Input
第一行一个正整数 test(1≤test≤10) 表示数据组数。
对于每组数据,第一行一个正整数 n(1≤n≤100000)。
接下来一行 n 个整数,第 i 个整数 ai 表示第 i 个朋友和小沃沃的距离。
Output
对每组数据输出一行一个数,表示 ∑n?1i=1∑nj=i+1dist(Pi,Pj) 的最小值。答案需要四舍五入到整数。
Sample Input
2
2
3 5
5
1 2 3 4 5
Sample Output
2
20
题解
#include #include #include #include #include #define ll long long using namespace std; int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); vector a(n); for(int i=0; i

Covid Problem Description
科学家小沃沃在研究病毒传播的规律,从而控制疫情。
有 n 个人,编号分别为 1,2,…,n。我们用荧光粉代替病毒,编号为 1 的人,在第 0 时刻涂上了荧光粉,剩下的人在第 0 时刻没有涂。
对于第 i 个人,我们知道这个人在哪些时刻出现在了哪些地方。
如果时刻 t,某个人和身体上有荧光粉的人,出现在了同一地点,那么从时刻 t 以后,这个人也会沾上荧光粉。
从小到大输出实验结束后身体上有荧光粉的人的编号。
Input
第一行一个整数 T(1≤T≤20) 表示 T 组数据。
对于每组数据,第一行一个整数 n(1≤n≤20000) 表示 n 个人。
对于第 i 个人,第一行输入一个整数 len[i] (1≤len[i]≤100) 表示这个人的活动轨迹。
接下来 len[i] 行,每行输入两个整数 t,p(1≤t≤100,1≤p≤10) 表示这个人 t 时刻出现在了 p 位置,保证 t 按严格递增的顺序给出。
除了这 len[i] 个时刻,这个人都呆在家里,或者换句话说,他/她不在任何位置。
保证 len[1]+len[2]+…+len[n]≤200000。
Output
对于每组数据输出一行,表示所有患者的编号。按编号从小到大输出。
Sample Input
2
4
2
1 1
2 2
3
2 2
3 3
4 4
1
4 4
1
2 1
3
3
1 1
3 1
6 1
3
4 1
5 1
6 1
1
5 1
Sample Output
1 2 3
1 2
样例解释
Case 1:
第 2 时刻,位置 2,1 与 2 相遇,2 沾上了。
第 4 时刻,位置 4,2 与 3 相遇,3 沾上了。
题解
#include #include #include #include using namespace std; int main() { int T,n,m,t,q; scanf("%d",&T); while(T--) { scanf("%d",&n); int a[20010]= {0,1}; vector se[120][15]; for(int i=1; i<=n; i++) { scanf("%d",&m); for(int j=1; j<=m; j++) { scanf("%d%d",&t,&q); se[t][q].push_back(i); } } for(int i=1; i<=110; i++) { for(int k=1; k<=10; k++) { for(int j=0; j

Car Problem Description
W 市最近面临了严重的交通拥堵问题,现在决定要在工作日(周一到周五)限号。
每天可以限制若干尾号的车辆,譬如说周一限尾号为 0 的车,周二限尾号为 1,2 的车。
每个尾号在五天当中最多只能被限一次,一天也可以什么牌照都不限。
我们要设置一个容量上限 m,使得至少存在一种方案,每一天不被限号的车的总数都小于等于 m。
请求出最小的 m。
Input
第一行一个整数 test(1≤test≤10) 表示数据组数。
对于每组数据,第一行一个正整数 n(1≤n≤10000) 表示这个城市里有多少辆车。
接下来 n 行,每行一个字符串表示车牌。车牌由 5 位字符构成,每位都是’0’-'9’的数字。两辆车的车牌可能相同。
Output
对于每组数据,一行一个整数表示答案。
Sample Input
2
1
00000
10
00000
00001
00002
00003
00004
00005
00006
00007
00008
00009
Sample Output
1
8
#include #include #include #include using namespace std; int t,n,m; int a[10],b[10]; string s; void dfs(int k) { if(k>9) { int x=b[0]; for(int i=1; i<5; i++) x=max(x,b[i]); m=min(m,x); return; } for(int i=0; i<5; i++) { b[i]-=a[k]; dfs(k+1); b[i]+=a[k]; } } int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); memset(a,0,sizeof(a)); for(int i=1; i<=n; i++) { cin>>s; ++a[s.back()-'0']; } sort(a,a+10); m=n; for(int i=0; i<5; i++) b[i]=m; dfs(0); printf("%d\n",m); } return 0; }

Drink Problem Description
一共有 n 个人,我们提供给他们三种饮料——可乐,雪碧,芬达。
每个人对这三种饮料的喜欢程度有一个顺序,一个人喝到他最喜欢的饮料可以得到 3 点快乐值,第二喜欢的饮料可以得到 2 点快乐值,第三喜欢的饮料可以得到 1 点快乐值。
我们一共有 n 瓶饮料,其中 a 瓶是可乐,b 瓶是雪碧,c 瓶是芬达,每个人恰好分到一瓶饮料。请问适当分配这些饮料, n 个人的快乐值的和最大是多少?
Input
第一行输入一个整数 T(2≤T≤1000) 表示 T 组数据。
每组数据第一行 4 个整数,n,a,b,c(n,a,b,c≥0) 分别表示人数,有 a 瓶可乐,b 瓶雪碧,c 瓶芬达。保证 a+b+c=n。
接下来 n 行,每行输入一个长度为 3 的字符串,第 i 行表示第 i 个人从高到低喜好的顺序。
字符串一定是 {"012","021","102","120","201","210"} 中的一种。字符 0 表示可乐,1 表达雪碧,2 表示芬达,按照最喜欢,第二喜欢,第三喜欢的顺序排列。例如 021 表示最喜欢可乐,第二喜欢芬达,第三喜欢雪碧。
保证 n 之和小于等于 100000。
Output
对于每组数据,一行一个整数表示答案。
Sample Input
2
3 1 1 1
012
102
201
3 1 1 1
012
012
012
Sample Output
9
6
Cloth Problem Description
有一个’凵’形的晾衣架,它长成一个长方形删去上面那条边以后得到的形状。也就是说,它由三根棍子组成,左边一根,右边一根,下面一根,左边、右边两根和下面那根分别垂直。左边那根长度和右边那根一样。且整个形状可以一笔画成。
【2020年百度之星·程序设计大赛-初赛二 补题/赛后】每件衣服都要晾在三根棍子中某一根上的某个点上。现在要求任意两件衣服之间的直线距离需要大于等于 x,请问最多能晒多少件衣服?
假设第 i 件衣服的位置为 Pi=(xi,yi),Pi必须在(0,0)到(0,a)的线段,(0,0)到(b,0)的线段以及(b,0)到(b,a)的三条线段之一上,且对于任意的 i,j (i≠j),需要满足 dist(Pi,Pj)≥x,其中 dist(X,Y) 为点 X 到点 Y 的直线距离。xi,yi 都不必须是整数。
Input
第一行一个正整数 test(1≤test≤100000) 表示数据组数。
对于每组数据,一行三个正整数 a,b,x(1≤a,b,x≤1000000) 分别表示左右两根杆子的长度,下面那根杆子的长度以及两件衣服之间的最短距离。
Output
对于每组数据,一行一个整数表示答案。
Sample Input
2
3 1 1
3 1 2
Sample Output
8
2
Hint
晾衣架的形状
| |
| |
| |
a a
| |
| |
___ b ___
Solo Problem Description
Alice 和 Bob 准备 solo 一场算法竞赛。
比赛一共有 n 个题,编号为 1,2…,n,对于第 i 道题,Alice 需要 a[i] 分钟写出一份正确的代码,Bob 需要 b[i] 分钟写出一份正确的代码。
比赛规则为
  1. 每道题第一个通过的人积 1 分,如果两人同时 AC 该题,只有 Alice 得分。
  2. 比赛时长为 1018 分钟。
Alice 和 Bob 的比赛策略都满足:决定要去做某道题后,会一直解决该题,直到自己或者对手 AC 此题,如果对手 AC 该题,则会立即放弃这题。
Bob 写完一份正确的代码后会立即提交,但 Alice 写完一份正确的代码,可以先暂时不交题,等之后再交(交题的时间忽略不计,任何时间都可以交题)。
另外 Alice 知道 Bob 是按 1,2,…,n 的顺序来依次做题,知道每道题自己需要的时间和 Bob 需要的时间(即 a 序列和 b 序列)。
输出 Alice 最优策略下最多得几分。
Alice 和 Bob 想题都不需要时间。
Input
第一行一个整数 t(1≤t≤10) 表示 t 组数据。
每组数据第一行一个整数 n(1≤n≤2000) 表示题数。
第二行 n 个整数,表示 a[1],a[2],…a[n] (1≤a[i]≤1000000000)。
第三行 n 个整数,表示 b[1],b[2],…b[n] (1≤b[i]≤1000000000)。
保证至多只有一组数据 n>100。
Output
对于每组数据,一行一个整数表示答案。
Sample Input
2
6
6 6 6 6 6 6
1 1 1 1 1 1
3
1 2 3
5 1 1
Sample Output
1
3
样例解释
Case 1 开场直接 rush 最后一题。
Case 2 [0,1) 写掉第一题,第 5 分钟交;[1,3) 写第二题第 6 分钟交,[3,6) 写第三题第 6 分钟交。
Hanoi Problem Description
X 同学自从学会了汉诺塔游戏之后就非常沉迷。汉诺塔游戏由三根柱子(标号为0、1、2)和一堆体积不同的圆盘组成。每根柱子上有一些圆盘。如果每根柱子上的圆盘体积都满足从上到下依次增大,那么称之为合法状态,否则为非法状态。从一个状态出发,可以将一个柱子最顶端的圆盘移到另一根柱子上,若移动之后仍是合法状态,则称这一步移动为“合法的”。现在给定合法的起始状态和结束状态,我们需要通过一系列“合法的”步骤将起始状态变换至结束状态。由于移动每一步都需要体力,X 同学想寻找移动步数最少的方案(最优方案)。特别地,X 同学对于最优方案下移动了 k 次盘子之后的局面感兴趣,但怎么也玩不好这个游戏,于是来咨询你。
Input
第一行一个整数 T(1≤T≤20),表示测试用例组数。
每组测试用例的第一行有两个整数 n(1≤n≤105) 和 k(0≤k≤1018),表示有 n 个圆盘,圆盘的体积分别为 1,2,…,n。k 如上述。
接下来一行表示起始状态,含 n 个整数,第 i 个整数表示体积为 i 的圆盘一开始所在的柱子。
接下来一行表示结束状态,含 n 个整数,第 i 个整数表示体积为 i 的圆盘最终所在的柱子。
可以证明给定每个圆盘所在的柱子后,只存在唯一一种合法状态。数据保证最优方案唯一,k 不大于最优方案移动总步数。
Output
输出 T 行整数。
对每组测试用例,输出一行共 n 个整数,第 i 个整数表示体积为 i 的圆盘在最优方案下移动了 k 步之后所在的柱子编号。
Sample Input
1
3 1
0 0 1
1 1 1
Sample Output
2 0 1

    推荐阅读