牛客練習賽67 補題 題解

2021-10-09 05:15:16 字數 2782 閱讀 7454

a.牛牛愛字串

題意:給定字串,輸出當中的數字,注意不能有前導零。

簡單模擬題,但格式要求非常嚴格,最後乙個數字後不能有空格。還有乙個坑點,如果只有0也是要輸出乙個0的。

我是用佇列模擬, 去掉前導零。

#include

using

namespace std;

const

int n =

1e5+10;

string s;

queue<

int> st[n]

;int

main()

}for

(int i =

0; i <= k; i++)}

int f =0;

if(st[k]

.size()

) f =1;

for(

int i =

0; i <= k; i++)if

(f && i != k) cout <<

" ";

elseif(

!f && i < k -

1) cout <<

" ";

} cout << endl;

}}

b.牛牛愛位運算

題意:任選n個數,要求&起來最大。

已知與只會變小,所以取乙個最大值就可以.

#include

using

namespace std;

int t;

intmain()

}

c 牛牛愛博弈

題意:有n顆石子,要求一次可以拿2^k個,拿到最後一顆的人獲勝

我們將2^k % 3, 發現答案是1, 2, 1, 2, 1, 2……

易得如果是3的時候,先手是必輸的,可以推出任何3的倍數都是必輸的.

#include

using

namespace std;

intmain()

}

d 牛妹愛數列

題意:你有乙個01串和兩種操作,

1.可以任意翻轉前n個數

2.單點翻轉乙個數

問最少操作多少次可以得到乙個0串

考慮dp

我們可以用dp1[i]代表將前i個數翻轉成1所需的最少次數,

用dp0[i]代表將前i個數翻轉成0所需要的最少次數

如果你想把前i個都變成0串,那麼會有兩種操作

1.將前i-1個數字都變成0, 再將i變成0

2.將前i-1個數字都變成1,再翻轉一次變成0

#include

using

namespace std;

const

int n =

1e5+10;

int a[n]

, dp1[n]

, dp0[n]

;int p[n]

;int

main()

dp0[1]

=(a[1]

==1);

dp1[1]

=1- dp0[1]

;for

(int i =

2; i <= n; i++

)printf

("%d\n"

, dp0[n]);

}

e 牛妹遊歷城市

題意:給n個城市,每個城市都有乙個權值,權值按位與之後不為0的點之間可以連一條權值為lowbit(a[i], a[j])的邊。

由於n的範圍為1e5,因此不能列舉所有點。

我們考慮將每個點都拆成32位,建立32個超級源點,將每個點向自己的超級源點連一條邊權為1<#include

using

namespace std;

typedef

long

long ll;

const

int inf =

1e16

;const

int n =

2e6+10;

int t, n, tot;

ll a[n]

, dis[n]

;int head[n]

, vis[n]

;inline

intlowbit

(int x)

struct edge e[n<<1]

;struct node };

priority_queue q;

void

add(

int u,

int v, ll w)

void

dij(

) dis[1]

=0; q.

push

(node);

while

(!q.

empty()

));}

}}intmain()

for(

int i =

1; i <= n +

40; i++

) dis[i]

= inf;

for(

int i =

0; i <

32; i++)}

}dij()

;if(dis[n]

== inf) cout <<

"impossible"

<< endl;

else cout <<

(dis[n]/2

)<< endl;

}}f 之後再補

牛客練習賽78 補題

b cca的搬運 注意陣列的頭和尾在實際模擬時的情形 include using namespace std const int maxn 1e5 5 int a maxn dp maxn n,m,x1,up maxn ans,sum,vis maxn d,b maxn k,t intmain fo...

牛客練習賽60補題

思路 考慮位運算 的特性 只有兩者都為1才會對答案有貢獻 且 對答案貢獻的值為 1 k 其中k是當前1所在二進位制下的位數 所以考慮預處理每乙個位的1出現的次數 其中對每一位都會遍歷n n次 所以每一位對答案的貢獻就是 a i a i 1 i a i 為當前位置1的個數 include using ...

牛客練習賽22題解

簡單瞎搞題 不會用bitset,所以沒做出來。實際上還是比較簡單的。include using namespace std bitset 1000005 dp 2 int main cout 2 count 簡單資料結構1 這裡要運用拓展尤拉定理。ab modp ab p b p p 0 modp ...