【排列组合】UVALive

来源:互联网 发布:中科大软件学院信息化 编辑:程序博客网 时间:2024/06/06 01:14

Problem Decription

给你T组测试数据,给你n组数,每组数包含data, num,代表data这个数有num个。问你怎么排列这些数,求出最大的分数(如何求分数,一个数的左边递减个数包括相等 和 右边递减个数包括相等的和 加上 1(本身)就是该点的分数,但你要求出所有数的分数和)。求出最大分数一共有多少种组合

思路:从小到大排序一定是最大的分数和。因为(只要这串数保持弧形)所以从小到大排序,这样方便求最大分数和方案数。具体看代码。输出%llu不然会Wrong

#include<bits/stdc++.h>using namespace std;#define mod 1000000007struct node{    long long data, num;    bool operator < (const node &b) const {        return data < b.data;    }};node a[100055];int main(){    int T, n, i, cas = 1;    scanf("%d", &T);    while(T--)    {        scanf("%d", &n);        for(i = 0; i < n; i++)        {            scanf("%llu %llu", &a[i].data, &a[i].num);        }        long long nn = 0, sum = 0, ans = 1;        sort(a, a + n);        for(i = 0; i < n; i++)        {            if(i != n - 1)            {                ans = ((ans % mod) * ((a[i].num + 1) % mod)) % mod;//方案数会特别大 所以取mod            }            nn += a[i].num;            sum += nn * a[i].num;//最大分数        }        printf("Case %d: %llu %llu\n", cas++, sum, ans);    }    return 0;}
原创粉丝点击