雖然本身寫過不少題,也參加不少比賽,可是由於本身是半路」出家「,起步也比較慢,一開始就是針對比賽學習得。而後仍是比較菜得感受,有時候可能比較機智吧。但我的仍是感受什麼都很差得,有些知識僅僅是知道,可是寫不出來,目前水平就是一些例如簡單dp,圖論的,搜索,簡單數論,而後就是思惟模擬,= =。雖然大三了,仍是決定從頭開始學一本書。從頭開始刷一本書,系統得學習一下。ios
UVA - 272 git
題意:就是讓你把奇數 " 換成 `` 和偶數 " 換成 '' 。wa了好幾回。由於用的是getline(cin,s)。不能讀取換行。學習
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main(){ int flag=0; char s; while(~scanf("%c",&s)){ if(s=='"'){ flag==0?cout<<"``":cout<<"''"; flag=flag?0:1; } else cout<<s; } return 0; }
UVA - 10082 spa
題意&思路:沒有什麼思路,又wa了幾回,緣由是沒有加上數字1234.。。。.net
#include<cstdio> #include<cstring> #include<iostream> #include<map> using namespace std; string s0="`1234567890-="; string s="QWERTYUIOP[]\\"; string s2="ASDFGHJKL;'"; string s3="ZXCVBNM,./"; int main(){ char str; while(~scanf("%c",&str)){ int flag=0; for(int j=1;j<s0.size();j++){ if(s0[j]==str){ cout<<s0[j-1],flag=1; break; } } if(flag) continue; for(int j=1;j<s.size();j++){ if(s[j]==str){ cout<<s[j-1],flag=1; break; } } if(flag) continue; for(int j=1;j<s2.size();j++){ if(s2[j]==str){ cout<<s2[j-1],flag=1; break; } } if(flag) continue; for(int j=1;j<s3.size();j++){ if(s3[j]==str){ cout<<s3[j-1],flag=1; break; } } if(flag) continue; else cout<<str; } return 0; }
UVA - 401 code
題意思路:問這個串是否是迴文串和是否是鏡像串。錯了幾回。緣由是在判斷是否是鏡像的時候,串爲奇數中間得那個字母也要判斷。ci
#include<cstring> #include<cstdio> #include<iostream> using namespace std; string s="AEHIJLMOSTUVWXYZ12358"; string rs="A3HILJMO2TUVWXY51SEZ8"; int main(){ string str; while(getline(cin,str)){ int flag0=0,flag1=0; //是否爲pai int l=0,r=str.size()-1; while(l<r){ if(str[l]!=str[r]) flag0=1;//no pa if(flag0) break; l++;r--; } l=0;r=str.size()-1; while(l<=r){ int tmp=0; for(int i=0;i<21;i++){ if(str[l]==s[i]&&str[r]==rs[i]) tmp=1; } if(!tmp) flag1=1;//no mi if(flag1) break; l++,r--; } if(!flag0&&!flag1) cout<<str<<" -- is a mirrored palindrome."<<endl; else if(!flag0) cout<<str<<" -- is a regular palindrome."<<endl; else if(!flag1) cout<<str<<" -- is a mirrored string."<<endl; else cout<<str<<" -- is not a palindrome."<<endl; cout<<endl; } return 0; }
UVA - 340 get
題意思路:講道理,看來很久沒看懂題意。大意是給你一個答案序列,和一堆猜想得序列。問每一個猜想序列中,有多少個(A)猜對得(序列位置相同數字相同),有多少個(B)雖然猜對了,可是位置不同。輸出(A,B) (我在輸出這裏pe了。。) 這裏要注意,B得數目是在A得數目去掉以後。例如答案序列1123 猜想1111 答案是(2,0)以後得11並不能算做Bstring
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=1000+10; int a[10],b[10],c[10]; int s[maxn],g[maxn]; int main(){ int n,t=1; while(scanf("%d",&n)!=EOF&&n){ printf("Game %d:\n",t);t++; memset(b,0,sizeof(b)); for(int i=0;i<n;i++) cin>>s[i],b[s[i]]++; while(1){ for(int i=0;i<10;i++) { a[i]=b[i],c[i]=0; } int flag=0,cnt=0,cnt1=0; for(int i=0;i<n;i++){ cin>>g[i]; if(g[i]) flag=1; if(g[i]==s[i]) cnt++,a[s[i]]--; else c[g[i]]++;//出現次數 } for(int i=0;i<10;i++){ cnt1+=min(a[i],c[i]); } if(!flag) break; printf(" (%d,%d)\n",cnt,cnt1); } } return 0; }
UVA - 1583 it
題意思路:題意很明確。就是找給定n得最小得m n=(m+m得個位數字相加)。新手可能會tle,注意下n和m相差得範圍。就好理解了。m+m得位數相加。然而m位數相加是固定得。
#include<iostream> #include<cstdio> using namespace std; int main(){ int n,t; cin>>t; while(t--){ int ans=0,cnt=0; cin>>n; int tmp=n; while(tmp){ cnt++; tmp/=10; } for(int i=n-cnt*11;i<=n;i++){ int sum=0; tmp=i; while(tmp){ sum+=tmp%10;tmp/=10; } if(i+sum==n){ ans=i;break; } } cout<<ans<<endl; } return 0; }
題意思路:給定一個循環序列,找出這個序列從某個字母開始的字典序最小的序列。直接擴展兩倍,找前面的長度。記錄最小的字典序。遇到首字母相同的比較更新,遇到不一樣的且小於當前保存的,替換答案。
#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int maxn=1e5+10; int cnt,mm; string a[maxn]; int main(){ int n; string s; cin>>n; while(n--){ cin>>s; cnt=0;mm=1000; string ans; int len=s.size(); s=s+s;//擴展 for(int i=0;i<len;i++){ if(s[i]-'0'<mm){ mm=s[i]-'0';cnt=0; ans=s.substr(i,len); } else if(s[i]-'0'==mm){ string tmp=s.substr(i,len); if(tmp<ans) ans=tmp; } } cout<<ans<<endl; } return 0; }
最小表示法O(n)
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int get(string s){ int len=s.size(); int i=0,j=1,k=0,t; while(i<len&&j<len&&k<len){ t=s[(i+k)%len]-s[(j+k)%len]; if(!t) k++; else{ if(t>0) i+=k+1; else j+=k+1; if(i==j) j++; k=0; } } return i>j?j:i; } int main(){ int n; string s; cin>>n; while(n--){ cin>>s; int len=s.size(); int t=get(s); s+=s; cout<<s.substr(t,len)<<endl; } return 0; }