C - Cram Time CodeForces - 1072C

题目链接:QAQ

 

题意:给你两个数a和b,让你用1,2,3,4,5....n的数去填满a和b,要求填满的数量最大,输出填满的方案

 

 

思路:因为我们肯定是从小开始填的,所以我们可以求出n*(n+1)/2=(a+b)满足的最大的n,这样1-n之间所有的数都是要用的。

然后我们只要从大到小的去填a或者b,如果a不能填就填b,这样就能用完所有的1-n了(因为我们肯定能填满一个数,另一个数可能有空缺。)

 

 

附上代码:

#include
#include
#include
#include
#include
using namespace std;
vector q1,q2;
int main(void) {
	long long  a, b;
	scanf("%lld%lld", &a, &b);
	long long tot = a + b;
	double num1 = 1 + 8 * tot;
	num1 = sqrt(num1);
	num1 = (-1 + num1) / 2;
	long long num2 = (long long)num1;
	if (num2 == 0) {
		printf("0\n\n0\n\n");
	}
	else {
		q1.clear(); q2.clear();
		for (int i = num2; i >= 1; i--) {
			if (a >= i) {
				q1.push_back(i);
				a -= i;
			}
			else {
				q2.push_back(i);
				b -= i;
			}
		}
		printf("%d\n", q1.size());
		for (int i = q1.size() - 1; i >= 0; i--) {
			if (i == 0) printf("%lld", q1[i]);
			else printf("%lld ", q1[i]);
		}
		printf("\n");
		printf("%d\n", q2.size());
		for (int i = q2.size() - 1; i >= 0; i--) {
			if (i == 0) printf("%lld", q2[i]);
			else printf("%lld ", q2[i]);
		}
		printf("\n");
	}
	return 0;
}

 

你可能感兴趣的:(C - Cram Time CodeForces - 1072C)