LibreOJ #515 贪心只能过样例

题目链接:https://loj.ac/problem/515

知识点:  DP、bitset类

解题思路:

  DP部分不难想到:从 a 到 b 遍历,然后在已有的状态上加上遍历得到的数字的平方,难点在于记录状态。

  于是我学到了一个新的 C++ 类,bitset,开熏~

  S最大只能到 1000000,所以我们开一个比 1000000 稍大的 bitset 类,bitset 上面的各位代表数字 1~1000000,如果能得到一个数字,那么就在这个数字对应的位上置 1,否则置 0。那么加法运算就用移位符解决,各种情况的合并用 ‘|’ 来处理。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <bitset>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 bitset<1000005> dp[2];
 8 int main(){
 9     int pre=0,now=1;
10     dp[0][0]=1;
11     int n,a,b;
12     scanf("%d",&n);
13     while(n--){
14         dp[now]=0;
15         scanf("%d%d",&a,&b);
16         for(int i=a;i<=b;i++)
17             dp[now]|=(dp[pre]<<(i*i));
18         swap(now,pre);
19     }
20     printf("%d\n",dp[pre].count());
21     return 0;
22 }

 

转载于:https://www.cnblogs.com/Blogggggg/p/7719849.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值