HDU 5742 :It's All In The Mind(贪心模拟)

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 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;
}

猜你喜欢

转载自blog.csdn.net/qq_43678290/article/details/88825080