为什么第三个测评点过不了啊,求助.....

P1150 Peter 的烟

wangbinyuan @ 2023-03-18 20:32:27

#include<iostream>
using namespace std;
int main()
{
    long long n,k,sum=0,num=0;
    cin>>n>>k;
    sum+=n;
    num+=n; 
    while(1)
    {
        if(num/k>0)
        {
            sum+=num/k;
            num=num/k;
        }
        else
        {
            break;
        }
    }
    cout<<sum;
    return 0;
}

by Wallacewwz @ 2023-03-18 20:49:15

#include<iostream>
using namespace std;
int main()
{
    long long n,k,sum=0,num=0;
    cin>>n>>k;
    sum+=n;
    num+=n;
    while(1)
    {
        if(num/k>0)
        {
            sum+=num/k;
            num++;
            num=num/k;
        }
        else
        {
            break;
        }
    }
    cout<<sum;
    return 0;
}

这样可以AC

if(num/k>0)里面添加了num++

其原理嘛,你自己想想你的思路吧


by Wallacewwz @ 2023-03-18 20:53:04

还是补充一下吧,就是说num表示的是当前吸掉的香烟数量,那么此时你吸掉多一根了,num就要加1,这样除完取整才行。只WA了一个点是因为巧合

啊对了,顺便发一下我的代码

我是纯模拟的

#include <bits/stdc++.h>
//#pragma GCC optimize(2)
using namespace std;
signed main()
{
    int n,k;
    cin >> n >> k;
    int h = 0;
    int all = n;
    int cnt = 0;
    while(all)
    {
        all--;
        cnt++;
        h++;
        if(h >= k)
        {
            all++;
            h = 0;
        }
    }
    cout << cnt << endl;
    return 0;
}

cnt表示一共吸掉的烟,h表示积攒的烟蒂,all表示剩下的烟。每当可以兑换时就直接兑换

思路非常简单,没必要那么麻烦

(当然你也可以参考题解里的神仙做法)


by wangbinyuan @ 2023-03-18 20:56:30

#include<iostream>
using namespace std;
int main()
{
    long long n,k,sum=0,num=0,rest=0;
    cin>>n>>k;
    sum+=n;
    num+=n; 
    while(1)
    {
        if(num / k > 0)
        {
            sum += num / k;
            rest = num % k;
            num /= k;
            num += rest;
            rest = 0;
        }
        else
        {
            break;
        }
    }
    cout<<sum;
    return 0;
}

刚才做出来了


by luojunkai @ 2023-03-27 20:53:54

@wangbinyuan

最简做法之一(自认为):

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,k,sum=0;
    cin>>n>>k;
    sum=n;
    while(n>=k)
    {
        sum+=n/k;
        n=n%k+n/k;
    }
    cout<<sum;
}

每次循环sum加上可换烟的数量,同时n剩的数量加换来烟的数量。最后输出就行了。

(代码量少,思路也挺简单,可以参考一下)


by Wangyuzeweihai @ 2023-04-07 16:43:28

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,k;
    cin>>n>>k;
    cout<<n+(n-1)/(k-1);
    return 0;
} 

刚才做出来


|