9度-王道论坛计算机考研数据结构算法实战测试(2)

来源:互联网 发布:java最新开发面试题 编辑:程序博客网 时间:2024/05/18 03:48

A . ACM

多级排序。调用STL中的sort就好,自己定义下排序的cmp函数。不多解释。

#include <iostream>#include <cstdio>#include <algorithm>#include <string>using namespace std; struct node{    string name;//名字    int num;//题目数    int time;//罚时}x[105];//队伍信息 bool cmp(node a, node b){    if(a.num == b.num){        if(a.time == b.time){            return a.name < b.name;//按名字字典序        }        return a.time < b.time;//按罚时少的    }    return a.num > b.num;//按题目多的} int main(){    int t;    while(cin>>t){        int i;         for(i = 0; i < t; ++i){            cin>>x[i].name>>x[i].num>>x[i].time;        }        sort(x, x + t, cmp);//排序         for(i = 0 ; i < t; ++i){            cout<<x[i].name<<endl;        }    }    return 0;}

B.小A的计算器

模拟题。类似高精度加法,只是改成26进制。题目数据范围比较小,可以直接先转10进制加法,然后再转26进制。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;char a[105], b[105];unsigned char c[105];int main(){int t;cin>>t;while(t--){cin>>a;cin>>b;int len1 = strlen(a) - 1;int len2 = strlen(b) - 1;int l = 0;int jin = 0;while(len1 >=0 && len2 >= 0)//处理当前两个数长度相同的情况{c[l] = (unsigned char)(jin + (a[len1] - 'a') + (b[len2] - 'a')) + 'a';if(c[l] >'z')//进位{c[l] = c[l] - 26;jin = 1;}else{jin = 0;}l++;len1--;len2--;}while(len1 >=0)//a比较大{c[l] = jin + a[len1];if(c[l] >'z'){c[l] = c[l] - 26;jin = 1;}else{jin = 0;}l++;len1--;}while(len2 >=0)//b比较大{c[l] = jin + b[len2];if(c[l] >'z'){c[l] = c[l] - 26;jin = 1;}else{jin = 0;}l++;len2--;}if(jin)//确定是否还存在进位{c[l] = jin + 'a';l++;}l--;while(1){//去掉前面多余的a,前导0if(c[l] == 'a'){l--;}else{break;}}int i;if(l == -1){//假如答案是0,输出aprintf("a");}for(i = l; i >= 0; --i){printf("%c",c[i]);}puts("");}return 0;}

C. 艾薇儿的演唱会

最短路径问题。本题用Dijkstra或floyed都可以。赤裸裸的题目。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;  const int N = 201;const int MAX = 10000000;int map[N][N], dist[N], path[N];//map是当前地图,dist是当前从起点到其他所有点的最短距离,path保存路径bool visited[N]; void Dijkstra(int n, int a)// Dijkstra实现,具体实现可以参考原理。{     int i, j, u, v = 0;    for ( i = 1; i <= n; i++ )    {            dist[i] = MAX;            path[i] = -1;            visited[i] = 0;    }    dist[a]=0;    for ( i = 1; i <= n; i++ )    {        u=-1;        for( j = 1; j <= n; j++ )        {            if ( visited[j] == 0 && (u==-1||dist[u]>dist[j]) )            {                u = j;            }        }         visited[u] = 1;        for ( j = 1; j <= n; j++ )        {            if ( visited[j] == 0 && dist[u] + map[u][j] < dist[j] )            {                dist[j] = dist[u] + map[u][j];                path[j] = u;            }        }     }} int main(){    int n,m,i,j;    int aa, bb;    while(scanf("%d %d",&n,&m)!=EOF)    {        scanf("%d %d", &aa, &bb);         for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)                map[i][j]=MAX;        }        int a,b,c,s,e;        for(i=0;i<m;i++)        {            scanf("%d %d %d",&a,&b,&c);            if(map[a][b]>c)//处理重边                map[a][b]=map[b][a]=c;        }        Dijkstra(n,aa);        printf("%d\n",dist[bb]);    }    return 0;}



原创粉丝点击