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 }
“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”