日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)

發(fā)布時(shí)間:2025/7/25 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

人生的大起大落莫過如此,下一場我一定要回紫。


【A】Points on the line

題意:

一個(gè)直線上有\(zhòng)(n\)個(gè)點(diǎn),要求去掉最少的點(diǎn),使得最遠(yuǎn)兩點(diǎn)距離不超過\(d\)。

題解:

暴力兩重for,更新答案。

#include<cstdio> #include<algorithm> using namespace std; #define F(i,a,b) for(int i=(a);i<=(b);++i) int n,q,ans=0; int a[100001]; int main(){scanf("%d%d",&n,&q);F(i,1,n) scanf("%d",a+i);sort(a+1,a+n+1);F(i,1,n){int xx=a[i], kk=-1;F(j,i,n){if(a[j]-xx>q) break;kk=j;}ans=max(ans,kk-i+1);}printf("%d",n-ans);return 0; }

【B】Our Tanya is Crying Out Loud

題意:

一個(gè)數(shù)\(n\),每次你可以花費(fèi)\(A\)的代價(jià)把它除以\(k\)(如果\(k|n\)),或者花費(fèi)\(B\)的代價(jià)把它減一。問把這個(gè)數(shù)變成1的最少代價(jià)。

題解:

暴力上,不能除減到能除為止,能除看是除了花費(fèi)少還是不除花費(fèi)少。

注意特判\(zhòng)(k=1\)。

#include<cstdio> #define ll long long int n,k,A,B; ll ans; int main(){scanf("%d%d%d%d",&n,&k,&A,&B);if(k==1) {printf("%lld",(ll)(n-1)*A);return 0;}while(n!=1){int x=n/k*k;if(x==0) {ans+=(ll)(n-1)*A; break;}if(n!=x) ans+=(ll)(n-x)*A, n=x;else{x=n/k;if((ll)(n-x)*A<=B) ans+=(ll)(n-x)*A;else ans+=B;n=x;}}printf("%lld",ans);return 0; }

【C】Phone Numbers

題意:

限定字符集,求長度為\(k\)的,字典序比給定長度為\(n\)的字符串大的最小的字符串。

題解:

①\(k>n\)時(shí),在原串后補(bǔ)上最小的字符。

②\(k<=n\)時(shí),答案為原串的前\(k\)位+1,即比原串\(k\)位前綴大的第一個(gè)字符串。

#include<cstdio> #define F(i,a,b) for(int i=(a);i<=(b);++i) #define F2(i,a,b) for(int i=(a);i<(b);++i) int n,k,tot; int px[150]; bool used[150]; char str[100010],use[30]; char ans[100010]; int main(){scanf("%d%d",&n,&k);scanf("%s",str);F2(i,0,n) used[str[i]]=1;F(i,1,140) if(used[i]) use[++tot]=i;F(i,1,tot) px[use[i]]=i; if(k>n){printf("%s",str);F(i,n+1,k) printf("%c",use[1]);return 0;}F2(i,0,k) ans[i]=str[i]; ans[k]='\0';int x=k-1;while(px[ans[x]]==tot){ans[x]=use[1];--x;}ans[x]=use[px[ans[x]]+1];printf("%s",ans);return 0; }

【D】Alena And The Heater

題意:

已知長度為\(n\)的數(shù)組\(a\)和等長的01串\(b\),和通過\(a\)生成\(b\)的方法:

\(b_1=b_2=b_3=b_4=0\)

對于\(5\le i\le n\)

如果\(a_i,a_{i-1},a_{i-2},a_{i-3},a_{i-4}>r\) 并且\(b_{i-1}=b_{i-2}=b_{i-3}=b_{i-4}=1\),那么\(b_i=0\)

如果\(a_i,a_{i-1},a_{i-2},a_{i-3},a_{i-4}<l\) 并且\(b_{i-1}=b_{i-2}=b_{i-3}=b_{i-4}=0\),那么\(b_i=1\)

如果以上兩者均不滿足,那么\(b_i=b_{i-1}\)。

試求出\(l,r\)的值。

題解:

可以看到,對計(jì)算有貢獻(xiàn)的只有\(zhòng)(b\)中出現(xiàn)連續(xù)的4個(gè)相同數(shù)字的情況。

通過這些情況,我們可以確定\(l,r\)的范圍,進(jìn)而求出\(l,r\)的可能值。

因?yàn)轭}目保證有解,只需輸出最極端的值(\(l_{min},r_{max}\))即可。

#include<cstdio> #include<algorithm> using namespace std; #define F(i,a,b) for(int i=(a);i<=(b);++i) int n,ansll=-1000000000,ansrr=1000000000; int a[100001]; char b[100009]; int main(){scanf("%d",&n);F(i,1,n) scanf("%d",a+i);scanf("%s",b+1);F(i,5,n){if(b[i-4]==b[i-3]&&b[i-3]==b[i-2]&&b[i-2]==b[i-1]){if(b[i-1]=='0'){int x=max(max(max(max(a[i],a[i-1]),a[i-2]),a[i-3]),a[i-4]);if(b[i]=='1'){//l > max(a 1~5)ansll=max(ansll,x+1);}}else{int x=min(min(min(min(a[i],a[i-1]),a[i-2]),a[i-3]),a[i-4]);if(b[i]=='0'){//r < min(a 1~5)ansrr=min(ansrr,x-1);}}}}printf("%d %d",ansll,ansrr);return 0; }

【E】Cashback

題意:

給定一個(gè)長度為\(n\)的數(shù)組\(a\)和一個(gè)常數(shù)\(c\)。你可以把\(a\)數(shù)組分割成連續(xù)的若干段,每一段的代價(jià)分別計(jì)算:

對于長度為\(len\)的一段,其代價(jià)為其元素總和,減去最小的\(\left \lfloor \frac{len}{c} \right \rfloor\)個(gè)元素。

求最小總代價(jià)。

題解:

既然要讓代價(jià)最小,我們轉(zhuǎn)化為求最大的價(jià)值,再用所有的元素和減去這個(gè)價(jià)值即可。

那就變成了長度為\(len\)的一段,其價(jià)值為最小的\(\left \lfloor \frac{len}{c} \right \rfloor\)個(gè)元素的和。

首先我們注意到一個(gè)結(jié)論:有貢獻(xiàn)價(jià)值的分段,其長度正好為\(c\)時(shí),沒有其他方法比它更優(yōu)。

證明請自行腦補(bǔ)……因?yàn)槲乙矝]想清楚,當(dāng)時(shí)考場上瞎猜的結(jié)論,有興趣的讀者不妨看看http://www.cnblogs.com/kkkkahlua/p/8468896.html。

那么,我們通過單調(diào)隊(duì)列處理出每個(gè)長為\(c\)的區(qū)間的最小值,記為\(b\)數(shù)組。

那么有DP方程\(f[i]=(max_{j=1}^{i-c}f[i])+b[i-c+1]\),表示前\(i\)個(gè)數(shù),最后一個(gè)區(qū)間必須選取的最大價(jià)值,答案為\(Sum-max(f[i])\)。

#include<cstdio> #include<algorithm> using namespace std; #define F(i,a,b) for(int i=(a);i<=(b);++i) #define ll long long int n,c; int a[100009],b[100009]; int que[100009],l=1,r=0; ll sum,f[100009],g[100009]; int main(){scanf("%d%d",&n,&c);F(i,1,n) scanf("%d",a+i);F(i,1,n) sum+=a[i];if(c>n) {printf("%lld",sum); return 0;}F(i,1,c){while(l<=r&&a[que[r]]>=a[i]) --r;que[++r]=i;} b[1]=a[que[l]];F(i,c+1,n){if(que[l]<=i-c) ++l;while(l<=r&&a[que[r]]>=a[i]) --r;que[++r]=i;b[i-c+1]=a[que[l]];}F(i,1,n-c+1){if(i<=c) f[i]=b[i];else{f[i]=b[i]+g[i-c];}g[i]=max(g[i-1],f[i]);}printf("%lld",sum-g[n-c+1]);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/PinkRabbit/p/8469943.html

總結(jié)

以上是生活随笔為你收集整理的【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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