C - Cram Time CodeForces - 1072C

1448 ワード

タイトルリンク:QQQ
 
标题:aとbを2つ数えて1,2,3,4,5...nの数はaとbを満たし、満たす数が最大であることを要求し、満たすスキームを出力する.
 
 
考え方:私たちは小さい頃から記入していたに違いないので、n*(n+1)/2=(a+b)が満たす最大のnを求めることができ、1-nの間のすべての数が使用されます.
それから私たちは大きいものから小さいものまでaあるいはbを記入して、もしaが記入できないならばbを記入して、このようにすべての1-nを使い切ることができます(私たちはきっと1つの数を満たすことができて、もう1つの数は空きがあるかもしれません).
 
 
コードを添付:
#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

0

"); } 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
", q1.size()); for (int i = q1.size() - 1; i >= 0; i--) { if (i == 0) printf("%lld", q1[i]); else printf("%lld ", q1[i]); } printf("
"); printf("%d
", q2.size()); for (int i = q2.size() - 1; i >= 0; i--) { if (i == 0) printf("%lld", q2[i]); else printf("%lld ", q2[i]); } printf("
"); } return 0; }