算法入門系列之排序與檢索
阿新 • • 發佈:2018-08-18
一個 str show tor cal else color mem 函數
UVA340
UVA10420
時間有點久遠,很早之前寫的,然後忘記總結了,這道題其實很容易,一行只取第一個字符串,然後按照字典序輸出每個字符串的個數。
這裏有個技巧就是先用scanf獲取第一個字符串,然後再用gets直接吸收剩下的字母。其次就是用map記錄個數,然後用叠代器輸出結果
#include<iostream> #include<cstring> #include<cstdio> #include<map> using namespace std; map<string,int> ma; charUVA10420a[100]; char str[100]; int n; //同一行字符串,如果只用最前面的一個詞,可以先用scanf,然後用gets int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",str); gets(a); ++ma[str]; } map<string,int> ::iterator iter; for(iter=ma.begin();iter!=ma.end();iter++){ cout<<iter->first<<" "<<iter->second<<endl; } return 0; }
UVA10474
水題
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int a[10000],x[10000]; int m,n,k; int main(){ int num=0;UVA10474while(scanf("%d%d",&m,&n)!=EOF&&m!=0&&n!=0){ memset(a,0,sizeof(a)); num++; for(int i=1;i<=m;i++){ scanf("%d",&x[i]); } sort(x+1,x+m+1); for(int i=1;i<=m;i++){ if(a[x[i]]==0) a[x[i]]=i; } /* for(int i=1;i<=m;i++){ cout<<a[i]<<endl; }*/ cout<<"CASE# "<<num<<":"<<endl; for(int i=1;i<=n;i++){ scanf("%d",&k); if(a[k]==0)cout<<k<<" not found"<<endl; else cout<<k<<" found at "<<a[k]<<endl; } } return 0; }
UVA152
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> using namespace std; double a[5001],b[5001],c[5001]; int sum[10]; double distances(int x,int y){ double res=(a[x]-a[y])*(a[x]-a[y])+(b[x]-b[y]) *(b[x]-b[y])+(c[x]-c[y])*(c[x]-c[y]); return sqrt(res); } void call(int len){ double distsum; for(int i=0;i<len;i++){ distsum=10; for(int j=0;j<len;j++){ if(i==j)continue; double dist=distances(i,j); if(dist<distsum)distsum=dist; } sum[(int)distsum]++; } } int main(){ freopen("x.txt","r",stdin); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); int i=0; while(scanf("%lf%lf%lf",&a[i],&b[i],&c[i])!=EOF){ if(a[i]==0&&b[i]==0&&c[i]==0){ call(i); break; }else i++; } for(int i=0;i<10;i++){ printf("%4d",sum[i]); } printf("\n"); return 0; }UVA152
UVA299
冒泡排序
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int a[10005]; int n,m; void sorts(int n){ int sum=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(a[i]>a[j]){ swap(a[i],a[j]); sum++; } } } printf("Optimal train swapping takes %d swaps.\n",sum); } int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d",&a[i]); } sorts(m); } }UVA299
UVA755
水題
註意一點該題可以將字符串轉化為一個7位的數字進行比較,然後按照格式輸出即可。
格式需要註意的是,取除數,求余數字可能不是對應的位數,所以需要使用setfill,和setw兩個函數,前者是填充的字符是什麽,後者是填充的位數。
#include<cstdio> #include<iostream> #include<map> #include<cstring> #include<stdlib.h> #include<algorithm> #include<iomanip> using namespace std; map<int,int> ma; char s[100]; //前導0! int call(char* s){ int num=0; int len=strlen(s); for(int i=0;i<len;i++){ if(s[i]==‘A‘||s[i]==‘B‘||s[i]==‘C‘){ num=num*10+2; }else if(s[i]==‘D‘||s[i]==‘E‘||s[i]==‘F‘){ num=num*10+3; }else if(s[i]==‘G‘||s[i]==‘H‘||s[i]==‘I‘){ num=num*10+4; }else if(s[i]==‘J‘||s[i]==‘K‘||s[i]==‘L‘){ num=num*10+5; }else if(s[i]==‘M‘||s[i]==‘N‘||s[i]==‘O‘){ num=num*10+6; }else if(s[i]==‘P‘||s[i]==‘R‘||s[i]==‘S‘){ num=num*10+7; }else if(s[i]==‘T‘||s[i]==‘U‘||s[i]==‘V‘){ num=num*10+8; }else if(s[i]==‘W‘||s[i]==‘X‘||s[i]==‘Y‘){ num=num*10+9; }else if(s[i]<=‘9‘&&s[i]>=‘0‘){ num=num*10+(s[i]-‘0‘); } } return num; } int main(){ int n,m; //freopen("x.txt","w",stdout); scanf("%d",&n); for(int i=0;i<n;i++){ ma.clear(); scanf("%d",&m); for(int j=0;j<m;j++){ scanf("%s",s); ma[call(s)]++; } int flag=0; for(map<int,int>::iterator iter=ma.begin();iter!=ma.end();++iter){ if(iter->second!=1){ flag=1; int x=iter->first; cout<<setfill(‘0‘)<<setw(3)<<x/10000; cout<<‘-‘; cout<<setfill(‘0‘)<<setw(4)<<x%10000; cout<<" "<<iter->second<<endl; } } if(flag==0) cout<<"No duplicates."<<endl; if(i!=n-1)cout<<endl; } return 0; }UVA755
算法入門系列之排序與檢索