uva7147 World Cup(思路)

题意:ios

一共有n(1e9)我的,有m(1e9)个晋级,两两之间打一次,输赢平各有一个得分,平分随机排名,问晋级的人可能的最小得分和没晋级的人可能的最大得分。spa

思路:code

就是想一下状况就行了,若是赢的分不如输的分高,就交换一下,要求晋级的人的最小得分,那他确定是第m名,blog

就让前m-1我的全都赢了他和那些没晋级的人(这样确保前m-1我的得分最大了,内部怎么搞无所谓),ci

而后他跟剩下的那些没晋级的人能够全都平,能够赢的局数大于等于一半,这里要讨论一下,若是是要打偶数局,那确定输赢个半,若是是奇数局,那就要输赢个半还剩下一局,string

那局要取平和赢中较低的一种(平的话就是跟后面的人全都并列,但也晋级了),还要讨论一下全部人都平的状况,有可能这样是最低的。it

而后是求没晋级的人可能的最大得分。思路差很少吧,他跟剩下的没晋级的人打全都赢了(晋级的m我的也是),而后就是他跟晋级的m我的打,io

可能输赢个半或者奇数的时候剩下的那局取输和平的较大的一种,跟前面同样的,再比一下全平的取一个最大。class

/* ***********************************************
Author        :devil
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <unordered_map>
#include <string>
#include <time.h>
#include <cmath>
#include <stdlib.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define ou(a) printf("%d\n",a)
#define pb push_back
#define pii pair<int,int>
#define mkp make_pair
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=1e5+10;
int t;
LL n,m,a,b,c;
int main()
{
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++)
    {
        cin>>n>>m>>a>>b>>c;
        if(a<c) swap(a,c);
        LL ans1=b*(n-1);
        LL ans2=ans1;
        LL cnt=(m/2)*(a+c);
        if(m%2!=0) cnt+=max(b,c);
        ans1=max(ans1,(n-m-1)*a+max(m*b,cnt));
        cnt=(n-m)/2*(a+c);
        if((n-m)%2!=0) cnt+=min(b,a);
        ans2=min(ans2,(m-1)*c+min((n-m)*b,cnt));
        printf("Case #%d: ",cas);
        cout<<ans1<<' '<<ans2<<endl;
    }
    return 0;
}
相关文章
相关标签/搜索