2021/10/9 vj rating
题目链接:cf 478B

题解:求最大值,m队各分一个人,剩下n-m加到任意一个队伍,求(n-m+1)个人任选两个人成为好友,也就是组合数
求最小值,也就是尽量均分每组人数,有剩余人数则一个个加到剩下的队伍即可
代码:
# include <iostream>
# include <cmath>
# include <algorithm>
# include <string.h>
using namespace std ;
const int N = 1e5 + 10;
typedef long long ll;
int main (){
ll n , m;
cin >> n >> m;
ll max = (n - m + 1) * (n - m) / 2;
ll num1,num2;
num1 = n/m;
num2 = n%m;
ll min;
min = (num1 - 1)*num1 /2 * (m - num2);
min += (num1 + 1) * num1/2 * num2;
printf("%lld %lld",min,max);
return 0;
}
链接cf 478C

题意:让三个颜色的气球组合,每种组合至少有两种不同色,求最多有多少组
题解:三色气球数量小的的两个色的气球加起来,个数小于等于最多的气球的一半,那么个数就是数量小的两色气球的和,否则,就让三色气球加起来除以三即可(如果有完全相同的情况出现,那么说明有一种球会比较多,那我尽量使少的两个球去到尽量多的组,那就是每组放一个,另两个为最多的那种球,总共组数为两个较少球的和。那么出现3个球颜色相同时,即较小两个球的个数和小于最多球个数除以2这一条件。当不满足这一条件时,则不会存在极端情况出现3球颜色相同,即组数必定能最大化,所以就是sum/3。)
代码:
# include <iostream>
# include <cmath>
# include <algorithm>
# include <string.h>
using namespace std ;
const int N = 1e5 + 10;
typedef long long ll;
int main (){
ll a[3];
ll sum = 0;
for (int i = 0;i < 3; i ++){
scanf("%lld",a+i);
sum += a[i];
}
sort (a,a+3);
ll ans;
if (a[0]+a[1] <= a[2]/2)
ans = a[0] + a[1];
else
ans = sum/3;
printf("%lld",ans);
return 0;
}

浙公网安备 33010602011771号