玩游戏——题解

3 篇文章 0 订阅
2 篇文章 0 订阅

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

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

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值