日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round #671 (Div. 2)

發(fā)布時(shí)間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #671 (Div. 2) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)天晚上,本來(lái)想?yún)⒓右幌卤荣?#xff0c;結(jié)果感覺(jué)靜不下心來(lái)做題,而且最難受的是讀個(gè)題都不明白,一直在理解題意·。·

A - Digit Game

分析不難發(fā)現(xiàn):
如果nnn是奇數(shù),那么最后留下的數(shù)字一定是奇數(shù)位上的數(shù)字,如果奇數(shù)位上的數(shù)字至少存在一個(gè)奇數(shù),那么先手必勝。
如果nnn是偶數(shù),那么最后留下的數(shù)字一定是偶數(shù)位上的數(shù)字,如果偶數(shù)位上的數(shù)字至少存在一個(gè)湊數(shù),那么后手必勝。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; int n; int main() {IO;int T=1;cin>>T;while(T--){cin>>n;string s;cin>>s;s="."+s;bool ok;if(n&1){ok=0;for(int i=1;i<=n;i++)if(i%2==1&&(s[i]-'0')%2==1) ok=1;}else{ok=1;for(int i=1;i<=n;i++){if(i%2==0&&(s[i]-'0')%2==0) ok=0;}}if(ok) cout<<1<<'\n';else cout<<2<<'\n';}return 0; }

B - Stairs

首先只要知道每個(gè)樓梯的邊長(zhǎng),那么可以用等差數(shù)列求出所有小方塊的個(gè)數(shù)。樓梯的邊長(zhǎng)2n?12^{n}-12n?1,然后只需要一個(gè)一個(gè)枚舉即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; int main() {IO;int T=1;cin>>T;while(T--){ll x;cin>>x;ll s=0;int res=0;ll a=1;for(int i=1;;i++){ll now=2*a-1;s+=1ll*now*(now+1)/2;if(s<=x) res++;else break;a<<=1;}cout<<res<<'\n';}return 0; }

C - Killjoy

這題我也讀了很久才理解題意
不難發(fā)現(xiàn)最終答案就三種情況{0,1,2}\{0,1,2\}{0,1,2}
000:最初所有ai=xa_i=xai?=x
111:存在ai=xa_i=xai?=x或者∑i=1nai=nx\sum_{i=1}^{n}a_i=nxi=1n?ai?=nx(如果ak=xa_k=xak?=x那么它一開始就會(huì)被感染,一場(chǎng)比賽可以把其余的aia_iai?都變成xxxaka_kak?用來(lái)調(diào)整保證改變之和為000
222:其余情況答案都是2

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=1010; int a[N]; int n,x; int main() {IO;int T=1;cin>>T;while(T--){cin>>n>>x;int s=0;bool ok1=1;bool ok2=0;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]!=x) ok1=0;if(a[i]==x) ok2=1;s+=a[i];}if(ok1) cout<<0<<'\n';else if(ok2||s==n*x) cout<<1<<'\n';else cout<<2<<'\n';}return 0; }

D1 - Sage’s Birthday (easy version)

分析可知先把原數(shù)組排序,然后把前?n2?\lfloor \frac{n}{2}\rfloor?2n??的數(shù)按順序插到后?n2?\lceil \frac{n}{2}\rceil?2n??的縫隙中的構(gòu)造結(jié)果肯定最優(yōu)。然后可以掃一遍統(tǒng)計(jì)下答案即可。(如果原數(shù)組的數(shù)不同那么不難發(fā)現(xiàn)答案一定是?n?12?\lfloor \frac{n-1}{2}\rfloor?2n?1??

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=100010; int a[N],b[N],c[N]; int n; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);for(int i=1;i<=n/2;i++) b[i]=a[i];for(int i=n/2+1;i<=n;i++) c[i-n/2]=a[i];cout<<(n-1)/2<<'\n';for(int i=1;i<=(n+1)/2;i++){cout<<c[i]<<' ';if(i<=n/2) cout<<b[i]<<' ';}cout<<'\n';}return 0; }

D2 - Sage’s Birthday (hard version)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=100010; int a[N],b[N],c[N]; int n; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);for(int i=1;i<=n/2;i++) b[i]=a[i];for(int i=n/2+1;i<=n;i++) c[i-n/2]=a[i];for(int i=1,j=1;i<=(n+1)/2;i++){a[j++]=c[i];if(i<=n/2) a[j++]=b[i];}int res=0;for(int i=2;i<n;i++)if(a[i]<a[i-1]&&a[i]<a[i+1]) res++;cout<<res<<'\n';for(int i=1;i<=n;i++) cout<<a[i]<<' ';cout<<'\n';}return 0; }

E - Decryption

說(shuō)點(diǎn)兒廢話:2020/9/20下午,在圖書館看了一下這個(gè)題,好不容易分析出如何構(gòu)造能夠得出答案,然后回寢室一直調(diào)代碼調(diào)到12點(diǎn),調(diào)代碼能力還是太菜了,不能把想法快速實(shí)現(xiàn)還要多練。現(xiàn)在已經(jīng)凌晨了2020/9/21,明天早上第一節(jié)沒(méi)有課,爬起來(lái)把題解補(bǔ)了。

考慮將nnn分解質(zhì)因數(shù),可得n=p1a1×p2a2×…×piain=p_1^{a_1}×p_2^{a_2}×\dots\ ×p_i^{a_i}n=p1a1??×p2a2??×?×piai??
考慮這樣一組排列方式的構(gòu)造{[p1,p12,…,p1a1],[],[pi,pi2,…,piai]}\{[p_1,p_1^2,\dots, p_1^{a_1}],[],[p_i,p_i^2,\dots, p_i^{a_i}]\}{[p1?,p12?,,p1a1??],[],[pi?,pi2?,,piai??]}不難發(fā)現(xiàn)中間[][][]中只要包含p1p_1p1?那么無(wú)論怎么排列一定不互質(zhì)(存在相同因子p1p_1p1?),因此中間括號(hào)只需要用dfs求出所有包含p1p_1p1?質(zhì)因子的約數(shù)即可(但是我們需要讓nnn放置在最后)。根據(jù)dfs的性質(zhì),[][][]中的最后一個(gè)數(shù)一定有質(zhì)因子pip_ipi?(當(dāng)前最后一個(gè)質(zhì)因數(shù)),那么我們下一個(gè)排的時(shí)候就要排pip_ipi?因此每次需要和當(dāng)前最后一個(gè)質(zhì)因數(shù)交換一下位置。

根據(jù)上述構(gòu)造可得當(dāng)且僅當(dāng)一個(gè)數(shù)的質(zhì)因數(shù)是2并且質(zhì)因子的指數(shù)都是1(n=p1×p2n=p_1×p_2n=p1?×p2?)才需要插入一個(gè)最小公倍數(shù),否則都不需要插入最小公倍數(shù)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> #define p first #define a second using namespace std; typedef pair<int,int> pii; typedef long long ll; const int N=200010; pii d[N]; int cnt,n,idx; ll ans[N]; void divide(int x) {idx=cnt=0;for(int i=2;i<=x/i;i++)if(x%i==0){d[++cnt].p=i;d[cnt].a=0;while(x%i==0) x/=i,d[cnt].a++;}if(x>1) {d[++cnt].p=x;d[cnt].a=1;} } void dfs(int u,ll now) {for(int i=u;i<=cnt;i++){ll p=1;for(int j=1;j<=d[i].a;j++){p*=d[i].p;if(now*p!=n) ans[++idx]=now*p;dfs(i+1,now*p);}} } int main() {IO;int T=1;cin>>T;while(T--){cin>>n;divide(n);for(int i=1;i<=cnt;i++){ll p=1;for(int k=1;k<=d[i].a;k++) {p*=d[i].p;if(p!=n) ans[++idx]=p;//注意把n放在最后}//括號(hào)間的數(shù)p=1;for(int k=1;k<=d[i].a;k++) {p*=d[i].p;dfs(i+1,p);}if(i<cnt) swap(d[i+1],d[cnt]);}for(int i=1;i<=idx;i++) cout<<ans[i]<<' ';cout<<n<<'\n';if(cnt==2&&d[1].a==1&&d[2].a==1) cout<<1<<'\n';else cout<<0<<'\n';}return 0; }

要加油哦~

總結(jié)

以上是生活随笔為你收集整理的Codeforces Round #671 (Div. 2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。