洛谷P1582 倒水
作者:互联网
题目描述 https://www.luogu.org/problemnew/show/P1582
这道题经历了 70 80 90 100的坎坷路程
易得2的次方个瓶子可以倒在一起,所以只需要每一次找出n中最大的2的次方的数,将n减去这个数,k–,直到k=1
然后找出比k大的最小2的次方数,用这个数减去k就是答案。
然而我只得了70分,后来我想是不是2的31次方是不是不能用int,果然改了long long后我高了10分
然后我继续想会不会中间就把水倒完了,还没有用到k个杯子,改了以后,果然又高了10分
最后 当k=1时,如果n=1,也是不用买新的了,果然这道题终于过了。
由此可见 思路对了 细节是多么的重要
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,ans,fl;
long long a[35];
int main()
{
scanf("%d%d",&n,&k);
a[0]=1;
for(int i=1;i<=31;i++) a[i]=a[i-1]*2;
while(k!=1)
{
int i;
for(i=1;i<=31;i++) if(a[i]>n) break;
n=n-a[i-1];
if(n<=0){fl=1; break;}
k--;
}
int i;
if(fl==1||n==1){ cout<<0; return 0;}
for(i=1;i<=31;i++) if(a[i]>n) break;
ans=a[i]-n;
printf("%d",ans);
return 0;
}
标签:倒水,洛谷,int,long,break,ans,次方,P1582,include 来源: https://blog.csdn.net/qq_42920122/article/details/88963278