玩游戏——题解

题目大意:
A和B玩游戏。游戏龟则很简单:设有n轮,则第i轮赢的人分数+i,输的不变(没有平局)。
给出两个分数 a , b ,问是否有满足该分数的 n ,并输出满足该分数时,第一人赢了哪几局(输出一个方案即可)
0≤ a , b ≤maxint

一眼马上就有二维背包 f [ i ] [ j ] 的想法,不过。。
再仔细思考,会发现要满足条件,则 a + b = i = 1 n
等差数列一套,就会发现 n 也没多大,也就 10 5 级别
可接下来怎么搞?又一维背包?
然后,我们就要充分发挥作为信息学竞赛选手丰富的想(xia)象(cai)力——只要有 n ,就一定有解 > a 从后往前搞,当 i a 时就用 i
。。然后,完美过了。。(太弱证不来,请大佬指教)

#include<cstdio>
#define LL long long
using namespace std;
LL a,b,c,ans,cnt,k[1000005];
void write(LL x){if(x<10) putchar(x+'0');else write(x/10),putchar(x%10+'0');}
LL check(LL x){
    LL L=0,R=1e6,mid,now;
    while(L<=R){
        mid=L+R>>1;
        now=(LL)(1+mid)*mid>>1;
        if(now==x) return mid;
        if(now<x) L=mid+1;else R=mid-1;
    }
    return -1;
}
int main(){
    scanf("%lld%lld",&a,&b),c=a+b;
    LL i=check(c);ans=i;
    if(i<0){puts("No");return 0;}
    while(a){if(a>=i) k[++cnt]=i,a-=i;i--;}
    write(ans);
    while(cnt) putchar(' '),write(k[cnt--]);putchar('\n');
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42403731/article/details/80667016