Codeforces Round #145 (Div. 2, ACM-ICPC Rules)
C. Weath
水,暴力確定正數的起點,有DP的手法計算消耗即可
#include<stdio.h>#define eps 1e8#define LMT 1000005//知道這題很弱。//你要先選擇一個正數的起點,然後會有各種消耗,算消耗是可以用DPint temp[LMT],dp[LMT],rdp[LMT];int main(void){ freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); int i,n,ans; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&temp[i]); if(i>0) dp[i]=dp[i-1]+(temp[i-1]>=0); } ans=eps; for(i=n-1;i>=0;i--) { rdp[i]=rdp[i+1]+(temp[i]<=0); dp[i]+=rdp[i]; if(i>0) ans=dp[i]>ans?ans:dp[i]; } printf("%d\n",ans); return 0;}
Codeforces
Round #143 (Div. 2) B. Magic, Wizardry and Wonders
#include<stdio.h>/*注意這種只有去一種的題,用怪想法。讓A[I]取值範圍最寬極端取值法,最好K為0,這樣什麼都不用管了,要儘可能長久的取到某數,貪心,遞推能力不夠*/int main(void){ int a[105]; int n,l,d,i; scanf("%d%d%d",&n,&d,&l); for(i=1;i<n;i++) { if(d>0)a[i]=l; else a[i]=1; d=a[i]-d; } a[n]=d; if(a[n]<=0||a[n]>l)printf("-1\n"); else { for(i=1;i<=n;i++) printf("%d ",a[i]); printf("\n"); } return 0;}
Codeforces Round #139 (Div. 2) C.
Barcode
基本DP,確定最長與最短無後效性的位置,黑白相間段落的基本技能
#include<stdio.h>#include<string.h>#define LMT 1002//往後指,確定長度,黑白段DPint sum[LMT][2],dp[LMT][2];int main(){ int n,m,x,y,i,j; char c; memset(dp,-1,sizeof(dp)); scanf("%d%d%d%d",&n,&m,&x,&y);getchar(); sum[0][1]=sum[0][0]=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { c=getchar(); if(c=='.') sum[j][0]++; else sum[j][1]++; } getchar(); } for(i=1;i<=m;i++) { sum[i][1]+=sum[i-1][1]; sum[i][0]+=sum[i-1][0]; } dp[0][0]=dp[0][1]=0; for(i=x;i<=m;i++)//寫主體的時候不要前功盡棄... for(j=i-x;j>=0&&j>=i-y;j--) { if(dp[j][1]!=-1) { if(dp[j][1]+sum[i][0]-sum[j][0]<dp[i][0]||dp[i][0]==-1) dp[i][0]=dp[j][1]+sum[i][0]-sum[j][0]; } if(dp[j][0]!=-1) { if(dp[j][0]+sum[i][1]-sum[j][1]<dp[i][1]||dp[i][1]==-1) dp[i][1]=dp[j][0]+sum[i][1]-sum[j][1]; } } printf("%d\n",dp[m][1]>dp[m][0]?dp[m][0]:dp[m][1]); return 0;}
Codeforces Round #135 (Div. 2) C.
Color Stripe
其實一開始的想法是對的,主要沒有考慮兩種顏色的情況
#include<stdio.h>#define LMT 500005char s[LMT];int n,k,p1,p2;//注意對小資料的檢查//貪心就是亂搞int main(void){ int i; scanf("%d%d%s",&n,&k,s); if(k==2) { for(i=0;i<n;i++) { if(s[i]-'A'!=i%2)p1++; else p2++; } printf("%d\n",p1<p2?p1:p2); if(p1>p2) for(i=0;i<n;i++)printf("%c",'A'+(i+1)%2); else for(i=0;i<n;i++)printf("%c",'A'+i%2); printf("\n"); } else { int ans=0; for(i=2;i<n;i++) { if(s[i-2]==s[i-1]) { s[i-1]='A'; while(s[i-1]==s[i]||s[i-2]==s[i-1])s[i-1]++; ans++; } } if(s[n-2]==s[n-1]) { s[n-1]='A'; while(s[n-2]==s[n-1])s[n-1]++; ans++; } printf("%d\n%s\n",ans,s); } return 0;}Codeforces Round #135 (Div. 2)A.
k-String
#include<iostream>#include<string>using namespace std;//純暴力手法,沒有想象力啊,跟蹤解法...//如果兩個字串直接有公用元素,那麼,把他們聯合起來,那個元素在任何位置都可以符合題意//記得聯合法//隨意暴力出一個元素,然後進行配對,有C++寫吧,被跪類..string s,s1,s2;int jud(int i,int time){ int p,t; for(p=0;p<=i;p++) for(t=1;t<time;t++)//這個字串裡最多可以承受幾個元素,t<time代表有time個 if(s[p]!=s[p+t*(i+1)]) return 0; return 1;}int main(void){ cin>>s1>>s2; int i,j,ans,l1=s1.size(),l2=s2.size(); s=s1+s2; i=0;ans=0; while(i<l1&&i<l2) { if(l1%(i+1)==0&&l2%(i+1)==0) { j=(l1+l2)/(i+1); if(jud(i,j))ans++; } i++; } cout<<ans<<endl; return 0;}