前段時間,由於校園網的問題,一直打不開csdn,再加上前陣子的懈怠,我已經很久沒寫部落格了,不過,為了即將到來的省賽和藍
橋杯,我決定要改過自新,奮發向上。
題目連結:http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/38
仙劍奇俠傳 題目連結: http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1225
水題,不解釋。
#include<iostream>#include<cstdio>using namespace std;int main(){ int T; scanf("%d",&T); while(T--) { int i,n,l,ans=0,x,tmp=100; scanf("%d%d",&n,&l); for(i=0;i<n;i++) { scanf("%d",&x); if(l>=x) ans+=10/(l-x+1); if(ans>=tmp) { tmp+=100; l++; } } printf("%d %d\n",l,ans); } return 0;}
摺疊
題目連結:
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1226
水題,不解釋。
#include<iostream>#include<string>#include<cstdio>using namespace std;int main(){ int T; scanf("%d",&T); while(T--) { int i,l,a=0,b=0; string str; cin>>str; l=str.size(); if(l==1) cout<<str<<endl; else if(l%2==0) { for(i=0;i<l/2;i++) a=a*10+str[i]-'0'; for(i=l-1;i>=l/2;i--) b=b*10+str[i]-'0'; printf("%d\n",a+b); } else { for(i=0;i<=l/2;i++) a=a*10+str[i]-'0'; for(i=l-1;i>l/2;i--) b=b*10+str[i]-'0'; printf("%d\n",a+b*10); } } return 0;}<span style="font-size:24px;"></span>
Digit
題目連結:
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1227
當時比賽時,語言理解能力太差了,不知道數位是什麼意思,後來經隊友解釋,才知道是123456789101112...這些數一直排列下
去,然後讓你求第n個數,我頓時,就哭暈了。其實要解這題也不是很難,首先類比位元,找出是哪個位元,然後求解便可。
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;int main(){ int T,t=9;; ll i,num[10],maxn[10]; num[1]=9; maxn[1]=1; for(i=2;i<10;i++) { t*=10; num[i]=i*t+num[i-1]; maxn[i]=maxn[i-1]*10; } scanf("%d",&T); while(T--) { ll n; scanf("%lld",&n); if(n<10) { printf("%lld\n",n); continue; } ll pos=1; for(i=1;i<10;i++) if(num[i]>=n) { pos=i; n-=num[i-1]; break; } int flag=0; if(n%pos==0) flag=-1; long long ans=maxn[pos]+n/pos+flag; for(i=0;i<pos;i++) { if((pos-i)%pos==n%pos) { printf("%lld\n",ans%10); break; } ans/=10; } } return 0;}
最小的數
題目連結:
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1228
以前做過類似的題,不過沒說只能相鄰的交換。不過這題也不是很難。首先另開一個數組,從小到大排列,然後從首位依次遍曆(首位不能為0)與較小數交換,為什麼不說最小數呢,因為題目給了交換步數限制,所以你在有限步數內找到較小數然後交換,如果步數還有充裕的,則進行下一位操作,操作過程重複第一步即可。
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int main(){ int T; scanf("%d",&T); while(T--) { char str[1010],tmp[1010]; int vis[1010]; int i,j,k,l,p,t1; memset(vis,0,sizeof(vis)); scanf("%s%d",str,&k); l=strlen(str); strcpy(tmp,str); sort(tmp,tmp+l); for(i=0;i<l&&k;i++) { for(j=0;j<l;j++) { int flag=1; if(vis[j]||tmp[j]>=str[i]) continue; if(!i&&tmp[j]=='0') continue; for(p=i+1;p<l;p++) { if(str[p]==tmp[j]) { if(k<p-i) flag=0; else { k-=(p-i); for(t1=p;t1>i;t1--) swap(str[t1],str[t1-1]); vis[j]=1; } break; } } if(flag) break; } //cout<<str<<endl; //cout<<k<<endl; } printf("%s\n",str); } return 0;}
煩人的異或
5.說實話,我還不知道這題怎麼做呢。先貼上別人的部落格,以後再更新。
http://www.cnblogs.com/zhengguiping--9876/p/4461329.html
6.Curious Maze 很蛋疼的一道題,這幾天忙著省賽,以後更新。
http://202.197.224.59/OnlineJudge2/index.php/Contest/read_problem/cid/38/pid/1230
人產生就 題目連結: http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1231
dp水題。先用dp找出最大數,然後再類比剛才的過程求出所有的路。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[510][510];int dp[510][510];int num[510][510];int main(){ int n; while(scanf("%d",&n)!=EOF) { int i,j; memset(dp,0,sizeof(dp)); memset(num,0,sizeof(num)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&a[i][j]); dp[i][j]=max(dp[i][j-1],dp[i-1][j])+a[i][j]; } } num[1][1]=1; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(a[i][j]==dp[i][j]-dp[i][j-1]) num[i][j]+=num[i][j-1]; if(a[i][j]==dp[i][j]-dp[i-1][j]) num[i][j]+=num[i-1][j]; num[i][j]%=123456; } } printf("%d\n",num[n][n]); } return 0;}
8.括弧匹配 題目連結: http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1232
stack的一個簡單運用,思想,我代碼裡的備忘已經很詳細了就不多說了。
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<stack>#include<map>#include<algorithm>using namespace std;struct node{ int index,x,y,r[4];//index表示它的序號,x表示它的屬性,y表示它的後序或前序,r[]依次代表小括弧,中括弧,大括弧}no[100010];int main(){ char str[100010]; int mm,x; map<char,int> m; stack<node> s; m['(']=1;m['[']=2;m['{']=3; m[')']=4;m[']']=5;m['}']=6;//用map存放括弧的屬性 while(scanf("%s",str+1)!=EOF) { memset(no,0,sizeof(no)); int i; for(i=1;str[i];i++) { no[i].index=i; no[i].x=m[str[i]]; if(m[str[i]]<=3) s.push(no[i]); else { node p,t; p=s.top(); s.pop(); no[i].y=p.index; //記錄它的前序 p.y=i; if(s.size()) { t=s.top(); s.pop(); t.r[1]+=p.r[1]; t.r[2]+=p.r[2]; t.r[3]+=p.r[3]; t.r[p.x]++; s.push(t); } no[p.index]=p; //賦值前序 } } scanf("%d",&mm); while(mm--) { scanf("%d",&x); int j; j=min(x,no[x].y); //因為給出的x有可能是後序,所以要判斷 printf("%d %d %d %d\n",no[x].y,no[j].r[1],no[j].r[2],no[j].r[3]); } printf("\n"); } return 0;}