虽然自己写过很多题,也参加很多比赛,但是因为自己是半路”出家“,起步也比较慢,一开始就是针对比赛学习得。然后还是比较菜得感觉,有时候可能比较机智吧。但个人还是感觉什么都不好得,有些知识仅仅是知道,但是写不出来,目前水平就是一些例如简单dp,图论的,搜索,简单数论,然后就是思维模拟,= =。虽然大三了,还是决定从头开始学一本书。从头开始刷一本书,系统得学习一下。

 

TEX Quotes

​UVA - 272 ​

题意:就是让你把奇数 " 换成 `` 和偶数 " 换成  '' 。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 ​​ 

题意&思路:没有什么思路,又wa了几次,原因是没有加上数字1234.。。。

#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 ​

题意思路:问这个串是不是回文串和是不是镜像串。错了几次。原因是在判断是不是镜像的时候,串为奇数中间得那个字母也要判断。

#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 ​

题意思路:讲道理,看来好久没看懂题意。大意是给你一个答案序列,和一堆猜测得序列。问每个猜测序列中,有多少个(A)猜对得(序列位置相同数字相同),有多少个(B)虽然猜对了,但是位置不一样。输出(A,B) (我在输出这里pe了。。) 这里要注意,B得数目是在A得数目去掉之后。例如答案序列1123 猜测1111 答案是(2,0)之后得11并不能算作B

 

#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 ​

题意思路:题意很明确。就是找给定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;
}