牛客网 【每日一题】5月20日题目 简单瞎搞题
生活随笔
收集整理的這篇文章主要介紹了
牛客网 【每日一题】5月20日题目 简单瞎搞题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
比賽鏈接
文章目錄
- 題目描述
- 題解:
- 代碼:
題目描述
輸入描述:
第一行一個數 n。 然后 n 行,每行兩個數表示 li,ri。
輸出描述:
輸出一行一個數表示答案。
示例1
輸入
輸出
26備注:
1 ≤ n , li , ri ≤ 100
題解:
xi的是在 [li , ri]中任選一個,然后構成值,所以可以用分組背包來做
dp[i][j]前i個數字能否構成j
那么dp [ i -1 ] [ j - x[ i ]* x [ i ] ] = = 1則說明加上第i個數則可以構成,x [ i ] 的取值范圍 是題目所給 l[i]和r[i]
這樣做肯定不行,哪那么簡單
復雜度過高,我們需要壓縮下
先注意dp的值無疑是0或1,所以可以用bitset.
bitset 在 bitset 頭文件中,它是一種類似數組的結構,它的每一個元素只能是0或1,每個元素僅用1bit空間。
這樣,我們用dp [ i ]表示第i行的01串
dp [ i ]= dp [ i ] | ( d p [ i - 1 ] < < ( x [ j ] 2 ) )
bitset還有自帶的求1的個數的count,這樣就更方便了
代碼:
#include<bits/stdc++.h> #include<bitset> using namespace std; typedef long long ll; int num1,num2; const int maxn=130; int a[maxn]; bitset<1000009>dp[130]; int n; int main(){ cin>>n;dp[0][0]=1;for(int i=1;i<=n;i++){int l,r;cin>>l>>r;for(int j=l;j<=r;j++)dp[i]|=(dp[i-1]<<(j*j));}cout<<dp[n].count();return 0; }總結
以上是生活随笔為你收集整理的牛客网 【每日一题】5月20日题目 简单瞎搞题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站跳出率怎么计算(网站跳出率怎么计算的
- 下一篇: 牛客网 【每日一题】5月21日题目 图的