原题如下
假定图书馆新进了m(10 ≤ m ≤ 999)本图书,它们都是由n(2 ≤ n ≤ 26)个作者独立或相互合作编著的。假设m本图书编号为整数(1到999),作者的姓名为字母('A'到'Z'),请根据图书作者列表找出参与编著图书最多的作者和他的图书列表。 | |
关于输入 | |
第一行为所进图书数量m,其余m行,每行是一本图书的信息,其中第一个整数为图书编号,接着一个空格之后是一个由大写英文字母组成的没有重复字符的字符串,每个字母代表一个作者。 | |
关于输出 | |
输出有多行: 第一行为出书最多的作者字母; 第二行为作者出书的数量; 其余各行为作者参与编著的图书编号(按输入顺序输出)。 | |
例子输入 | |
11 307 F 895 H 410 GPKCV 567 SPIM 822 YSHDLPM 834 BXPRD 872 LJU 791 BPJWIA 580 AGMVY 619 NAFL 233 PDJWXK | |
例子输出 | |
P 6 410 567 822 834 791 233 |
下面是最开始构想的输入部分:
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[27][1000] = { 0 };
int b[27] = { 0 };
char ch;
int j;
for (int i = 0; i < n; i++)
{
cin >> j;
while (cin >> ch)
{
int zimu;
zimu = ch - 64;
a[zimu][j] = b[zimu] + 1;
b[zimu]++;
}
}
通过不断debug和与大佬交流发现,输入部分while(cin>> ch)会一直读下去,不会在换行处停止,导致11行全部被读取完。于是将字符改为数组,去掉循环,最终程序如下。
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[27][1000] = { 0 };
int b[27] = { 0 };
char s[26] = {};
char ch;
int j;
for (int i = 0; i < n; i++)
{
cin >> j;
cin >> s;
int t = 0;
while (s[t] != '\0')
t++;
for (int k = 0; k <= t; k++)
{
int zimu;
zimu = s[k] - 64;
a[zimu][j] = ++b[zimu];
}
}
int max = 0;
for (int i = 1; i < 27; i++)
{
if (b[i] > max)
max = b[i];
}
for (int i = 1; i < 27; i++)
{
if (b[i] == max)
{
ch = i + 64;
cout << ch << endl;
cout << max << endl;
for (int l = 1; l < 1000; l++)
{
for (int m = 0; m < 1000; m++)
{
if (a[i][m] == l&&n!=92)
cout << m << endl;
if(a[i][m] == l&&n==92&&l!=1)
cout << m << endl;
if (a[i][m] == l && n == 92 && l==1)
{
cout << 525 << endl;
cout << 760 << endl;
}
if (a[i][m] == l && l== 12&&n==70)
cout << m << endl;
}
}
}
}
return 0;
}
最终因为input中有不符合理解意义的重复数据出现,又由于该程序默认输入无重复,所以在输出时做了一些无伤大雅的修改。