Problem Description Professor Zhang has a number sequence
a1,a2,...,an
. However, the sequence is not complete and some elements are missing. Fortunately, Professor Zhang remembers some properties of the sequence:
1. For every
i∈{1,2,...,n}
,
0≤ai≤100
.
2. The sequence is non-increasing, i.e.
a1≥a2≥...≥an
.
3. The sum of all elements in the sequence is not zero.
Professor Zhang wants to know the maximum value of
a1+a2∑ni=1ai
among all the possible sequences.
Input There are multiple test cases. The first line of input contains an integer
T
, indicating the number of test cases. For each test case:
The first contains two integers
n
and
m
(2≤n≤100,0≤m≤n)
-- the length of the sequence and the number of known elements.
In the next
m
lines, each contains two integers
xi
and
yi
(1≤xi≤n,0≤yi≤100,xi<xi+1,yi≥yi+1)
, indicating that
axi=yi
.
Output For each test case, output the answer as an irreducible fraction "
p
/
q
", where
p
,
q
are integers,
q>0
.
Sample Input
2 2 0 3 1 3 1
Sample Output
1/1 200/201
题意:
有一个长为n的不增序列,给出序列中的部分值,求(a1+a2)/sum的最大值。
分析:
很显然的贪心,只要让a1,a2尽可能的大,让剩下的数尽可能的小即可。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
int a[110];
int main()
{
int t ;
cin >> t;
while(t--)
{
memset(a,-1,sizeof(a));
int n,m;
cin >> n >> m ;
for(int i = 0 ; i < m ; i ++)
{
int pos,data;
scanf("%d%d",&pos,&data);
a[pos] = data;
}
//长度是n;
int top = 0;
for(int i = n ; i >= 3 ; i --)
{
if(a[i] == -1) a[i] = top;
else top = a[i];
}
if(a[2] == -1)
{
if(a[1] == -1) a[2] = 100;
else a[2] = a[1];
}
if(a[1] == -1) a[1] = 100;
int fz,fm;
fz = fm = 0;
for(int i = 1 ; i <= n ; i ++) fm += a[i];
fz = a[1] + a[2];
int gcd = __gcd(fz,fm);
printf("%d/%d\n",fz/gcd,fm/gcd);
}
return 0;
}