QFNU-ACM 2021.10.09 Rating补题

注意点:
和为0时要特判一下。

代码:

#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

 CodeForces - 478B 

题意: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

 CodeForces - 478C 

题意: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

 

 

posted @ 2021-10-17 20:02  西瓜0  阅读(67)  评论(0编辑  收藏  举报