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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值