題意: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; }