题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5742
It's All In The Mind
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 754 Accepted Submission(s): 335
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.
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 .
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
Author
zimpha
Source
题目大意:求题目中所给
这个公式的最大值,其中我们有一些数字我们不知道,他只会给部分数字,ax=y。(这个数列是递减的,可以等于)
解题思路:
对于分数,肯定是分母越大越好,分子越小越好,只要满足这种情况就会大。由于ai的范围是大于等于0,小于等于100的。所以ai的最大值就是100。
但是这个公式是递减的,所以后面的数字不能比前面给出的数字大,所以直接和前面相等即为最优解。
详见代码。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a[110],Min;
int main()
{
int t,sum;
scanf("%d",&t);
while (t--)
{
int n,m,k,x,y;
k=sum=0;
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
for (int i=0; i<=2; i++)
a[i]=100;
for (int i=0; i<m; i++)
{
scanf("%d%d",&x,&y);
a[x]=y;
}
if (a[2]>a[1])
a[2]=a[1];
for (int i=n;i>=3;i--)
{
if (a[i]!=0)
{
k=a[i];
sum+=a[i];
continue;
}
a[i]=k;
sum+=a[i];
}
int mu=a[1]+a[2];
int zi=sum+a[1]+a[2];
int gcd=__gcd(mu,zi);
printf ("%d/%d\n",mu/gcd,zi/gcd);
}
return 0;
}