算法入门系列之排序与检索
Posted yvettey-me
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法入门系列之排序与检索相关的知识,希望对你有一定的参考价值。
UVA340
UVA10420
时间有点久远,很早之前写的,然后忘记总结了,这道题其实很容易,一行只取第一个字符串,然后按照字典序输出每个字符串的个数。
这里有个技巧就是先用scanf获取第一个字符串,然后再用gets直接吸收剩下的字母。其次就是用map记录个数,然后用迭代器输出结果
#include<iostream> #include<cstring> #include<cstdio> #include<map> using namespace std; map<string,int> ma; char a[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; while(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(" "); return 0; }
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. ",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); } }
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; }
以上是关于算法入门系列之排序与检索的主要内容,如果未能解决你的问题,请参考以下文章
算法系列之--Javascript和Kotlin的选择算法(原)