QFNU-ACM 2021.10.09 Rating补题
- 2021 年 10 月 17 日
- 筆記
代码:


#include<bits/stdc++.h> using namespace std; int main() { int a,b,c,d,e; cin>>a>>b>>c>>d>>e; int sum=0; sum=a+b+c+d+e; if(sum==0) { cout<<-1<<endl; } else { if(sum%5==0) { cout<<sum/5<<endl; } else cout<<-1<<endl; } }
View Code
B – B
题意:n 个参赛者以某种方式分成 m 个小组,每个小组至少有一个参赛者。 比赛结束后,来自同一团队的每一对参与者都成为了朋友。找出在比赛结束时可能形成的最小和最大朋友对数。
思路:
最少就是尽量平均分,若能平均分就平均分到每个组,若不能就将n/m个人分到m个组中,最后剩余的n%m个人再平均分,能分给n%m个组中,也就是分到的组中只能多分了一个人,没有多分到的有m-n%m个组,结果为(m-n%m)*C(n/m,2)+(n%m)*C(n/m+1,2);
最多就前m-1个小组各分一个人,其余人分为一组,计算C(n-m+1,2)
wa的原因:
做最少时,直接将n/m个人分给了m-1组中,剩余人归在了最后一组,即(m-1)*C(n/m,2)+C(n/m+n%m,2),这样是错误的。
代码:


#include<bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; long long maxx=(n-m+1)*(n-m)/2; int x=n/m; int y=n%m; long long minn=(m-y)*x*(x-1)/2+y*(x+1)*x/2; cout<<minn<<" "<<maxx<<endl; }
View Code
C – C
题意:r 个红色、g 个绿色和 b 个蓝色气球。要为宴会装饰一张桌子,您正好需要三个气球。附在某个桌子上的三个气球不应具有相同的颜色。如果我们知道每种颜色的气球的数量,最多可以装饰多少张桌子?
思路:将气球数量排序,每个桌子上的气球可以是两个一样的加一个其他色的,所以看最多的数目和两个小的数的二倍的关系,设做多的颜色球数为x,其他的两个的和为y,如果x>=y*2,那就可以是两个x表示的颜色的加上一个小数里面的任意一个,那结果就为 y;如果x<y*2,那就是先一个颜色一个组成三个气球放在每个桌子上,不够三个的从最多的那里补上,如果最多的那个有剩余且数目是3的倍数,就和有三种颜色的桌子交换一个气球,结果为(x+y)/3;
代码:


#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll s[5]; scanf("%lld %lld %lld",&s[0],&s[1] ,&s[2] ); sort(s,s+3); ll x,y; x=s[2]; y=s[1]+s[0]; if(x>=y*2) { cout<<y<<endl; } else cout<<(x+y)/3<<endl; }
View Code