问题来源
问题描述
著名出题人小Q每次比赛后都会写一份《赛题分析》,包含比赛概况、每题的参考算法以及一些统计数值。
对于一道题来说,小Q会统计最短的验题人代码长度(Shortest judge solution)以及赛内参赛队伍最短的AC代码长度(Shortest team solution)。
统计验题人代码长度比较容易,因为验题人最多也不会超过20个。但是统计选手代码长度就不容易了,因为大赛区动辄三四百支队伍。
请写一个程序,帮助小Q统计最短代码长度。
输入
第一行包含一个正整数T(1≤T≤13),表示赛题数量。
每道题第一行包含两个整数n,m(2≤n≤20,0≤m≤500),分别表示验题人数量以及AC了该题的队伍数量。
第二行包含n个正整数a1,a2,…,an(50≤ai≤65536),依次表示每个验题人的代码字节数。
第三行包含m个正整数b1,b2,…,bn(50≤bi≤65536),依次表示每支AC队伍的代码字节数。若m=0则该行为空行。
输出
对于第i(1≤i≤T)道题,输出三行,第一行输出Problem x:,其中x=i+1000。
第二行输出Shortest judge solution: y bytes.,其中y表示最短的验题人代码字节数。
第三行输出Shortest team solution: z bytes.,其中z表示最短的选手代码字节数,若不存在请输出N/A。
注意:间隔都是一个空格。
例子
AC的代码
#include <iostream>
using namespace std;
void f(int*a,int j)
{
for (int k = 0; k < j; k++)
{
for (int s = k + 1; s < j; s++) {
if (*(a + k) > *(a + s))
{
int temp = *(a + k);
*(a + k) = *(a + s);
*(a + s) = temp;
}
}
}
}
int main()
{
int t, ju, te,n[30],m[503],j;
cin >> t;
for (j = 0; j < t; j++)
{
cin >> ju;
cin >> te;
for (int g = 0; g < ju; g++)
{
cin >> n[g];
}
for (int h = 0; h < te; h++)
{
cin >> m[h];
}
f(m, te);
f(n, ju);
cout << "Problem " << (j + 1001)<<":"<<endl;
cout << "Shortest judge solution: " << *n<<" bytes."<<endl;
if (te == 0)
{
cout << "Shortest team solution: " << "N/A" << " bytes." << endl;
}
else
{
cout << "Shortest team solution: " << *m << " bytes." << endl;
}
}
}
问题思路
用一个函数排序求最小值,输出对应最小值,如果选手代码为0输出N/A。