Description
一个长度为n的序列,只知道其中m个点且知道这个序列满足一下三个性质
1.0<=ai<=100,i=1,2,…,n
2.a1>=a2>=a3>=…>=an
3.a1+a2+…+an!=0
求(a1+a2)/(a1+a2+…+an)的最大值
Input
第一行一整数T表示用例组数,每组用例首先输入两个整数n和m分别表示原序列长度和已知元素的数量,之后m行每行两个整数xi,yi表示a[xi]=yi
(2<=n<=100,0<=m<=n,1<=xi<=n,0<=yi<=100,xi严格递增,yi非严格递减)
Output
对于每组用例,输出(a1+a2)/(a1+a2+…+an)的最大值,化为最简分数形式
Sample Input
2
2 0
3 1
3 1
Sample Output
1/1
200/201
Solution
简单题,贪心的使a1和a2尽量大,使其他数尽量小
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 1e3;
int num[MAX];
int main()
{
int T;
cin >> T;
while (T--){
for (int i = 0; i < MAX; i++){
num[i] = -1; //初始为-1即没有值
}
int n, m;
cin >> n >> m;
int a, b;
for (int i = 1; i <= m; i++){
cin >> a >> b;
num[a] = b;
}
if (num[2] == -1 && num[1] == -1) { //贪心,让前两个数尽量大,后面的数尽量小
num[1] = num[2] = 100;
}
else if (num[2] != -1 && num[1] == -1){
num[1] = 100;
}
else if (num[1] != -1 && num[2] == -1){
num[2] = num[1];
}
int res = 0; //从后往前推,建立一个变量记录右端的不为-1的数
for (int i = n; i >= 3; i--){
if (num[i] == -1){
num[i] = res;
}
if (num[i] != -1){
res = num[i];
}
}
int pre = num[1] + num[2];
int sum = 0;
for (int i = 1; i <= n; i++){
sum += num[i];
}
int op = __gcd(pre, sum); //需要约分,__gcd()是<algorithm>中自带的最大公约数函数
cout << pre / op<< "/" << sum / op << endl;
}
return 0;
}