其他分享
首页 > 其他分享> > 洛谷P1582 倒水

洛谷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