紫書(一)第3章數組和字符串 UVA - 272 UVA - 10082 UVA - 401 UVA - 340 UVA - 1583 UVA - 1584

雖然本身寫過不少題,也參加不少比賽,可是由於本身是半路」出家「,起步也比較慢,一開始就是針對比賽學習得。而後仍是比較菜得感受,有時候可能比較機智吧。但我的仍是感受什麼都很差得,有些知識僅僅是知道,可是寫不出來,目前水平就是一些例如簡單dp,圖論的,搜索,簡單數論,而後就是思惟模擬,= =。雖然大三了,仍是決定從頭開始學一本書。從頭開始刷一本書,系統得學習一下。ios

 

TEX Quotes

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;
}

 

WERTYU

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;
}

 

Palindromes

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;
}

Master-Mind Hints

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;
}

Digit Generator

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;
}

Circular Sequence

UVA - 1584

題意思路:給定一個循環序列,找出這個序列從某個字母開始的字典序最小的序列。直接擴展兩倍,找前面的長度。記錄最小的字典序。遇到首字母相同的比較更新,遇到不一樣的且小於當前保存的,替換答案。

#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;
}