題目鏈結
#include
#define sc(x) scanf("%lld",&x);
#define pf printf
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define dep(i,e,s) for(int i=e;i>=s;i--)
using
namespace std;
typedef
long
long ll;
const
int inf=~0u
>>2;
const
int maxn=
1e5+7;
#define sis std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
intmain()
cout
}
打個表出來,然後用lower_bound(返回第乙個大於等於該元素的數)然後,計算個數,範圍其實不大,注意查詢得用二分,不然會tle
**:
#include
#define sc(x) scanf("%lld",&x);
#define pf printf
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define dep(i,e,s) for(int i=e;i>=s;i--)
using
namespace std;
typedef
long
long ll;
const
int inf=~0u
>>2;
const
int maxn=
1e5+7;
#define sis std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
ll b[maxn]
;int
main()
int t;
cin>>t;
while
(t--
)return0;
}
dp題,首先有個抽屜原理,當元素個數》=3600時直接輸出yes了。
01揹包。。
啊,不會dp呀。
假如:2000 1000 3000
一開始2000加入的時候,2000%3600=2000,便標記dp[2000]為1
下次加入1000的時候遍歷dp陣列一遍,會發現dp[1600]為1,便在這個基礎上加上a[i]再對3600取模(這裡因為只要1600被標記了故v中只加入了(1000+1600)%3600=1000),結果儲存在v陣列中,最後再用將v陣列中儲存的放入dp陣列中(dp[1000]=1),在標記(1000%3600=2600)dp[2600]=1;
這樣我們可以發現會大大縮小列舉範圍,比如很多組合加起來%3600都為4,在下一次加入時候,我們只要計算一次便可以得出結果是多少。
#include
using
namespace std;
int t,m,a[
100005];
//用於儲存初始資料
int dp[
3605];
int v[
10000
];暫存下餘數
intmain()
for(
int i=
1;i<=m&&
!dp[0]
;i++)}
for(
int j=
0;j) dp[a[i]
%3600]=
1;}if
(dp[0]
)printf
("yes\n");
else
printf
("no\n");
}}
牛客演算法周周練2
a 題意 求乙個數的順序和逆序之和。題解 其實就是個閹割版的高精度加法嘛。其實逆序數忽略前導零這個條件是沒有用的,因為順序數不可能有前導零,自然結果也不會有,然後注意下首位進製不取餘。include using namespace std int a 10 b 10 intmain for k j ...
牛客演算法周周練3
只寫了乙個,打遊戲去了 就是個搜尋模板,直接寫就行 include include include include include include using namespace std define mid 1000000007 typedef long long ll int book 106 ...
牛客演算法周周練4
c 階乘 題解 當n!是p的倍數時,n!中含有p的所有質因子且個數大於等於p的質因子個數,如p 8 222,只要n!的階乘中含有3個2就能整除。所以分為三步,篩選p中質因子及其個數,判斷n!是否滿足,二分尋找。include include include using namespace std t...