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つの数は空きがあるかもしれません).
コードを添付:
标题: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;
}