Roundgodとミルクティー(HDU-6667)

問題の説明

Roundgodは誰にも負けない南京大学の有名なミルクティーの恋人です。今年、彼はミルクティー祭を実施する予定。i番目のクラスは、学生を愛しているとミルクティーの双方向カップを行います。この祭りに参加し、Nクラス、があります。

Roundgodは味わうミルクティーに多くの学生を望んでいるので、彼はすべての学生は、ミルクティーのほとんど一杯で味わうことができると規定しています。また、学生は彼のクラスによって作られたミルクティーのカップを飲むことはできません。問題は、ミルクティーを飲むことができ、学生の最大数は何ですか、ですか?

入力

入力の最初の行は、テストケースの数を示す、単一の整数T(1≤T≤25)から成ります。

各テストケースは、単一の整数n(1≤n≤106)、クラスの数の行から始まります。次のnラインについて、各クラスの生徒の数と、それぞれ、このクラスで作られたミルクティーのカップの数を表す、二つの整数、B(0≦A、b≤109)を含みます。

すべてのテストケース上のnの合計は6×106を超えないことが保証されます。

出力

各テストケースのために、1つのラインの単一の整数として回答を印刷します。

サンプル入力

1
2
3 4
2 1

サンプル出力

3

問題の意味:、データの各セットは、nは、n個のクラスの整数を表し、与えられ、各クラスは、B [i]はお茶生産[i]の学生を、持っているデータのトン・セットは、各学生は、お茶を飲むことは今までありそして生徒の各クラスには、お茶を飲むどのように多くの学生尋ねるまで、自分のミルクを飲むことができません

アイデア:

第1最大流量反応が、ネットワーク・フローを記述するための方法を使用してデータが大きすぎ

あなたが貪欲で行うことができますが、それについて考えます

まず、すべてのレコードのと茶飲料のお茶を持って、その後、直接検討するユニット、各クラスがほとんどを飲むことができますどのように多くのカップ茶の計算としてクラスにそれぞれ、背面に正面から加工し、その後、ミルクティーの残りの部分からこのクラスを差し引きますお茶の数は、あなたが数えることができます

ソースプログラム

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<unordered_map>
#include<bitset>
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
#define Pair pair<int,int>
LL quickPow(LL a,LL b){ LL res=1; while(b){if(b&1)res*=a; a*=a; b>>=1;} return res; }
LL multMod(LL a,LL b,LL mod){ a%=mod; b%=mod; LL res=0; while(b){if(b&1)res=(res+a)%mod; a=(a<<=1)%mod; b>>=1; } return res%mod;}
LL quickMultPowMod(LL a, LL b,LL mod){ LL res=1,k=a; while(b){if((b&1))res=multMod(res,k,mod)%mod; k=multMod(k,k,mod)%mod; b>>=1;} return res%mod;}
LL quickPowMod(LL a,LL b,LL mod){ LL res=1; while(b){if(b&1)res=(a*res)%mod; a=(a*a)%mod; b>>=1; } return res; }
LL getInv(LL a,LL mod){ return quickPowMod(a,mod-2,mod); }
LL GCD(LL x,LL y){ return !y?x:GCD(y,x%y); }
LL LCM(LL x,LL y){ return x/GCD(x,y)*y; }
const double EPS = 1E-10;
const int MOD = 1000000000+7;
const int N = 1000000+5;
const int dx[] = {0,0,-1,1,1,-1,1,1};
const int dy[] = {1,-1,0,0,-1,1,-1,1};
using namespace std;

LL num[N],tea[N];
int main() {
    int t;
    scanf("%d",&t);
    while (t--) {
        int n;
        scanf("%d",&n);
        LL sum = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%lld%lld", &num[i], &tea[i]);
            sum += tea[i];
        }

        LL res = 0;
        for (int i = 1; i <= n; i++) {
            LL maxx = sum - (max(0LL, tea[i] - res)); //可以喝的数量
            LL cnt = min(maxx, num[i]); //当前班最多喝多少
            sum -= cnt;
            res += cnt;
        }
        printf("%lld\n", res);
    }
    return 0;
}

 

发布了1871 篇原创文章 · 获赞 702 · 访问量 194万+

おすすめ

転載: blog.csdn.net/u011815404/article/details/102535823