题解 P7427 【[THUPC2017] 玩游戏】
luckydrawbox · · 题解
传送门
分析
易得 ljcc 和学妹的总得分必定为
即 n=sqrt(2*(a+b))。
我们求出
-
若不相等,说明无解,直接输出
No,结束程序。 -
若相等,说明有解,输出
n ,接下来开始构造:
构造的想法与P7071 [CSP-J2020] 优秀的拆分的贪心相似,枚举 a-=i,并输出
当然,你会注意到 int 范围,所以要开 long long。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a,b,n;//long long莫忘
int main()
{
cin>>a>>b;
n=sqrt(2*(a+b));//求n
if(n*(n+1)!=2*(a+b))//判断是否相等
{
//无解
cout<<"No";
return 0;
}
//有解
cout<<n;
for(int i=n;a;i--)//从n开始向下枚举
{
if(a>=i)
{
a-=i;//尽量减大的
cout<<" "<<i;//注意格式
}
}
return 0;
}