这道题,做得我内牛满面,满脸春光淡退去,只剩下惆怅无限,我从编译错误到达了答案错误,由答案错误又走到运行时错误,再到格式错误,最后终于ac了,这人生也忒多姿多彩了有木有啊,如果有一天,有哪位骚年,莅临此地,希望能一解你心中对此题的困惑,我做题的方法没什么特殊的技巧,最最朴实基础,却坎坷无数啊!类似这种 排序-检索 问题,无非是读入字符串,截出字符串,比较字符串,排序字符串,输出字符串。
从一开始,我得到了编译错误,该死的uva不认识stricmp函数(不区分大小写的比较但有人说strcasecmp函数可以使用)和strrev(反转函数)于是乎我自己编写了stricmp函数和完成反转,另外,用gets的同胞千万注意数组越界的事情,编译器一遇gets一堆堆警告,看到警告千千万万别熟视无睹,要做到心里有数,问心无愧。
答案错误让我好找啊~先讲下我的思路:
我将字符串队名从读入的一行中截出,以‘#’为界,取‘#’后面字母装换为数字,暂时存储
另一个队从后往前操作,最后进行反转,我第一个错误,没注意到分数的范围是20分以下,也就是说我当时所存的数都只是一位数,其实可以有两位,于是我在c1 = g[i+1] - '0';后加了条语句 if(g[i+2] != '@') c1 = c1 * 10 + (g[i+2] - '0');。第二处错误是排序时最后按字母排序不分大小写,这题目木有明确的说明,我是看网上大家说了才找到,第三处错误,是我自己改变数据后测试出来的,原因是倒转的c2 不是c2 = c2 * 10 + (g[j-2] - '0'); 而是c2 = c2 + (g[j-2] - '0') * 10;(因为是反过来的)
for(int i = 0;;i++)
{
if(g[i] == '#')
{
ch1[i] = '\0';
c1 = g[i+1] - '0';
if(g[i+2] != '@')
c1 = c1 * 10 + (g[i+2] - '0');
break;
}
ch1[i] = g[i];
}
int s = strlen(g) - 1;
for(int j = s;; j--)
{
if(g[j] == '#')
{
ch2[s - j] = '\0';
c2= g[j-1] - '0';
if(g[j-2] != '@')
c2 = c2 + (g[j-2] - '0') * 10;
break;
}
ch2[s - j] = g[j];
}
吃一蛰长一智,我劝各位以后尽量不要看类似的代码只要改些地方就可以了而去粘贴,尽量自己手写,不然有错很难发现,这是我的经验,是血的教训。
另外,最后输出不留空格,祝大家顺利ac
我的代码:
#include<iostream>
#include<algorithm>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int stricmp(char * a,char * b)//不分大小写比较函数
{
if(!strcmp(a,b)) return 0;
else
{
int i,j;
char a1[35],b1[35];
for(i = 0; i < strlen(a); i++)
a1[i] = tolower(a[i]);
a1[i] = '\0';
for(j = 0; j < strlen(b); j++)
b1[j] = tolower(b[j]);
b1[j] = '\0';
return strcmp(a1,b1);
}
}
struct Team{
char ch[35];
int points;
int games;
int wins;
int ties;
int losses;
int goal_difference;
int goal_scord;
int goal_against;
}team[35];
char g[75],ch1[35],ch2[35];
void clean(Team * p,int t)
{
for(int i = 0;i < t;i++)
{
p[i].wins = 0;
p[i].goal_scord = 0;
p[i].goal_against = 0;
p[i].ties = 0;
p[i].losses = 0;
p[i].games = 0;
}
}//将数据清零函数
bool cmp(Team a,Team b)
{
if(a.points == b.points)
{
if(a.wins == b.wins)
{
if(a.goal_difference == b.goal_difference)
{
if(a.goal_scord == b.goal_scord)
{
if(a.games == b.games)
{
if(stricmp(a.ch,b.ch) < 0)
return true;
return false;
}
return a.games < b.games;
}
return a.goal_scord > b.goal_scord;
}
return a.goal_difference > b.goal_difference;
}
return a.wins > b.wins;
}
return a.points > b.points;
}//排序函数
int main()
{
char get[105];
int n;
cin >> n;
getchar();
while(n--)
{
int T,G,c1,c2;
gets(get);//锦标赛名称
cin >> T;//几个队伍
getchar();
for(int i = 0; i < T; i++)
gets(team[i].ch);
clean(team,T);
cin >> G;//几场比赛
getchar();
while(G--)
{
gets(g);
for(int i = 0;;i++)
{
if(g[i] == '#')
{
ch1[i] = '\0';
c1 = g[i+1] - '0';
if(g[i+2] != '@')
c1 = c1 * 10 + (g[i+2] - '0');
break;
}
ch1[i] = g[i];
}//正向截取信息
int s = strlen(g) - 1;
for(int j = s;; j--)
{
if(g[j] == '#')
{
ch2[s - j] = '\0';
c2= g[j-1] - '0';
if(g[j-2] != '@')
c2 = c2 + (g[j-2] - '0') * 10;
break;
}
ch2[s - j] = g[j];
}//反向截取信息
s = strlen(ch2);
for(int i = 0; i < s/2; i++)
{
char t = ch2[i];
ch2[i] = ch2[s - i-1];
ch2[s - i - 1] = t;
}//反转
for(int i = 0;;i++)
{
if(!stricmp(ch1,team[i].ch))
{
team[i].games += 1;
team[i].goal_scord += c1;
team[i].goal_against += c2;
if(c1 > c2) team[i].wins += 1;
else if(c1 == c2) team[i].ties += 1;
else team[i].losses += 1;
break;
}
}
for(int i = 0;;i++)
{
if(!stricmp(ch2,team[i].ch))
{
team[i].games += 1;
team[i].goal_scord += c2;
team[i].goal_against += c1;
if(c1 < c2) team[i].wins += 1;
else if(c1 == c2) team[i].ties += 1;
else team[i].losses += 1;
break;
}
}//记录进team
}
for(int i = 0; i < T; i++)
{
team[i].points = team[i].wins * 3 + team[i].ties;
team[i].goal_difference = team[i].goal_scord - team[i].goal_against;
}
sort(team,team + T,cmp);//排序
int rank = 0;
cout << get << endl;
for(int i = 0; i < T; i++)//输出
cout << ++rank << ") " << team[i].ch << ' ' << team[i].points
<< "p, " << team[i].games << "g (" << team[i].wins << '-' << team[i].ties
<< '-' << team[i].losses << "), " << team[i].goal_difference << "gd ("
<< team[i].goal_scord << '-' << team[i].goal_against << ')' <<endl;
if(n) cout << endl;
}
//getchar();
return 0;
}