【Codeforces 1031C】Cram Time
作者:互联网
【链接】 我是链接,点我呀:)
【题意】
题意
【题解】
如果找到最大的n使得1+2+...+n<=a+b
然后第一天输出1,2.3,4....t1
这里1+2+..+t1<=a
这还远远不够。
因为可能1+2+3...+t1<a
这就使得第一天还有剩余的时间没有用.
那么接下来如果继续让第二题从t1+1..n的话
可能第二题的累加和会大于b
所以我们可以这样,
让第二题再加上一天。
即输出1,2.3....t1,t1+1
然后从中删掉一个数字x=1+2+3..+t1+(t1+1)-a
显然这个数字是小于t1+1的,所以一定在第一天输出的序列中.
这样的话,第一题就能满满地用够a小时了。
然后再把x在第二题输出就好了,然后第二题从t1+2开始输出。。
注意t1=n的情况,这种情况的话,第二题就不用输出任何数字了,x也不用输出啦
【代码】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5;
ll a,b;
ll n;
int tag[N+10];
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> a >> b;
//(1+n)*n/2
for (n = 0;n*(1+n)/2<=(a+b);n++);
n--;
ll t1 = 0;
for (t1 = 1;t1*(t1+1)/2<=a;t1++);
t1--;
if (t1*(t1+1)/2==a){
cout<<t1<<endl;
for (ll i = 1;i <= t1;i++){
cout<<i<<" ";
}
cout<<endl;
cout<<n-t1<<endl;
for (ll i = t1+1;i <= n;i++){
cout<<i<<" ";
}
}else{
t1++;
ll temp = t1*(t1+1)/2-a;
cout<<t1-1<<endl;
int cnt = 0;
for (ll i = 1;i <= t1;i++)
if (i!=temp){
cout<<i<<" ";
cnt++;
}
if (cnt>0) cout<<endl;
cout<<n-(t1-1)<<endl;
if (n-(t1-1)>0)cout<<temp<<" ";
for (ll i = t1+1;i <= n;i++){
cout<<i<<" ";
}
}
return 0;
}
标签:输出,题意,int,ll,Codeforces,t1,Cram,1031C,第二 来源: https://www.cnblogs.com/AWCXV/p/10662333.html