Codeforces 1003D Coins and Queries 【性质】

知道做这道题需要性质,怎么入手?

我想的是输入保证了a[i]都是power of two,而不是任意的数,那么一定得从二的整次数幂入手解决问题。

想到如果一个b可以被拼出来,那么他就能被写成多个power of 2相加的形式;那么我们每次用最大的power of 2去拼这个b,然后power of 2再逐渐减小,如果能拼的出来的话那他一定是答案;那会不会出现原本拼的出来,但在这种策略下拼不出来的情况呢?(及不应该每次用最大的去拼b)不会,因为如果你能用其他的方式拼出b(而且有更大的power of 2可取但没取),那你一定可以用那些小点的power of 2拼出来这个大的power of 2

 

考场的时候我忽略了2^0=1,觉得如果b是基数那肯定拼不出来.....5555555555555

 

 1 #include<iostream>
 2 #include<map>
 3 using namespace std;
 4 
 5 int a[200005];
 6 map<int,int> m;
 7 
 8 int main(){
 9     int n,q; cin>>n>>q;
10     for(int i=1;i<=n;i++){
11         cin>>a[i];
12         m[ a[i] ]++;
13     }
14     
15     for(int i=1;i<=q;i++){
16         int b; cin>>b;
17         int count=0;
18         for(int j=29;j>=0;j--){//先用大的拼
19             if( b==0 ) break;
20             int num = (1<<j);
21             if( num>b || m[num]==0 ) continue;
22             int take =  min( m[num],b/num );
23             count+=take; b-=take*num;
24         }
25 
26         if(b>0) cout<<-1<<endl;
27         else cout<<count<<endl;
28     } 
29     
30     return 0;
31 }

 

转载于:https://www.cnblogs.com/ZhenghangHu/p/9262053.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值