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;
}
posted @ 2021-10-09 22:03  Gsding  阅读(65)  评论(0)    收藏  举报