牛客演算法周周練2

2021-10-05 02:31:41 字數 2029 閱讀 7778

題目鏈結

#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...