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

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,前导0
			if(c[l] == 'a'){
				l--;
			}
			else{
				break;
			}
		}
		int i;

		if(l == -1){//假如答案是0,输出a
			printf("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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值