hdu1225 football score
思路可以去看别人的,这里只谈遇到的问题。
编译的时候发现msvc2015的一个问题,输入scanf后要加_s, 这样一来输入字符的时候就要加上一个长度限定数字,传入一个和参数有关的大小值,避免引用到不存在的元素。这样很好,没毛病。但是oj就不干了,即使你在msvc上编译成功输出完全ojbk它会报wa~ 这时候要把scanf_s("%s",str,200) 换为scanf("%s",str),算法正确的话就ac了。
还有就是 scanf_s("%d", &to) == 1,说明输入一个整数,还是与scanf_s要传入一个和参数有关的大小值有关,否则也有可能报错。
#include<iostream>//hdu1225 结构体排序
#include<stdio.h>
#include<algorithm>
#include<string>
using namespace std;
char str1[10000], str2[10010], vs[5];//存放队名,以及vs字符
int t=0;
struct node {
char name[150];
int score, kick, net;
}a[10010];
int find(char str[]) //寻找字符下标
{
int i;
if (t == 0)
{
strcpy_s(a[0].name, str);
return t++;
}
for (i = 0; i < t; i++)
{
if (!strcmp(a[i].name, str))
return i;
}
if (i == t)
{
strcpy_s(a[t].name, str);
return t++;
}
}
bool cmp(node a, node b)
{
if (a.score == b.score)
{
if (a.net == b.net)
{
if (a.kick == b.kick)
return strcmp(a.name, b.name) < 0 ? 1 : 0;
else
return a.kick > b.kick;
}
else
return a.net > b.net;
}
else
return a.score > b.score;
}
int main()
{
char str1[10000], str2[10010], vs[10];
int to, m, n, x, y;
while (scanf_s("%d", &to) == 1) //否则RE
{
t = 0;
memset(a, 0, sizeof(a));
for (int i = 0; i < to*(to - 1); i++)
{
scanf_s("%s", str1,200);
x = find(str1);
scanf_s("%s", vs,3);
scanf_s("%s", str2,1000);
y = find(str2);
scanf_s("%d:%d", &m, &n);
a[x].kick += m;
a[y].kick += n;
a[x].net += m-n;
a[y].net += n-m;
if (m > n)
a[x].score += 3;
else if (m < n)
a[y].score += 3;
else if (m == n)
{
a[x].score += 1;
a[y].score += 1;
}
}
sort(a, a + to, cmp);
for (int i = 0; i < t; i++)
printf_s("%s %d\n", a[i].name, a[i].score);
cout << endl;
}
return 0;
}