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;
}