HDU 4546試合難易度(優先キュー**)
7308 ワード
試合の難易度
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 330 Accepted Submission(s): 83
Problem Description
最近、明ちゃんはACMのプログラミング問題を出して、HDOJで公開試合を行うことにしました.
仮に問題の数が全部でn道であると仮定すると、これらの問題の難易度は1000を超えない非負の整数に格付けされ、1試合に少なくとも1つの問題が必要であるが、この試合の難易度は、すべての問題の難易度の和であり、同時に、1試合はこの問題の順序とは関係なく、問題も繰り返さないと考えられる.
明らかに、次の情報が簡単に得られます.
試合は1つのテーマしか使わないと仮定し、n種類の案がある.
試合に2つのテーマを使うと仮定すると、(n-1)*n/2の案がある.
試合に3つのテーマを使うと仮定すると、(n-2)*(n-1)*n/6種類の案がある.
............
試合全体のn個のタイトルを使用すると仮定すると,このシナリオは1種のみである.
簡単な試算を経て、明ちゃんは総案数がほとんど天文数字であることを発見しました.
問題を簡単にするために、今明ちゃんはすべての案の中でm番目に小さい案を知りたいだけです.その試合の難易度はいくらですか.
Input
入力データの第1の挙動は、T組のテストデータがあることを示す整数T(1<=T<=20)である.
各グループのテストデータの第1行為の2つの整数n,m(0
Output
各テストデータのセットについて、1行の「Case#c:ans」(引用符を含まない)を出力し、ansは要求されるm番目の試合の難易度を表し、入力データはm番目の小さいスキームが存在することを保証し、具体的にはサンプルを参照してください.
Sample Input
2 5 6 1 1 1 1 1 5 25 1 2 3 4 5
Sample Output
Case #1: 2 Case #2: 11
Source
2013金山西山居クリエイティブゲームプログラム挑戦試合-初戦(1)
Recommend
liuyiding
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 330 Accepted Submission(s): 83
Problem Description
最近、明ちゃんはACMのプログラミング問題を出して、HDOJで公開試合を行うことにしました.
仮に問題の数が全部でn道であると仮定すると、これらの問題の難易度は1000を超えない非負の整数に格付けされ、1試合に少なくとも1つの問題が必要であるが、この試合の難易度は、すべての問題の難易度の和であり、同時に、1試合はこの問題の順序とは関係なく、問題も繰り返さないと考えられる.
明らかに、次の情報が簡単に得られます.
試合は1つのテーマしか使わないと仮定し、n種類の案がある.
試合に2つのテーマを使うと仮定すると、(n-1)*n/2の案がある.
試合に3つのテーマを使うと仮定すると、(n-2)*(n-1)*n/6種類の案がある.
............
試合全体のn個のタイトルを使用すると仮定すると,このシナリオは1種のみである.
簡単な試算を経て、明ちゃんは総案数がほとんど天文数字であることを発見しました.
問題を簡単にするために、今明ちゃんはすべての案の中でm番目に小さい案を知りたいだけです.その試合の難易度はいくらですか.
Input
入力データの第1の挙動は、T組のテストデータがあることを示す整数T(1<=T<=20)である.
各グループのテストデータの第1行為の2つの整数n,m(0
Output
各テストデータのセットについて、1行の「Case#c:ans」(引用符を含まない)を出力し、ansは要求されるm番目の試合の難易度を表し、入力データはm番目の小さいスキームが存在することを保証し、具体的にはサンプルを参照してください.
Sample Input
2 5 6 1 1 1 1 1 5 25 1 2 3 4 5
Sample Output
Case #1: 2 Case #2: 11
Source
2013金山西山居クリエイティブゲームプログラム挑戦試合-初戦(1)
Recommend
liuyiding
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,num[10010],res[10010];
struct node{
int cursum; //
int nextsum; //
int id; //
node(){}
node(int _cur,int _next,int _id):cursum(_cur),nextsum(_next),id(_id){}
bool operator < (const node &a) const{
return a.nextsum<nextsum;
}
};
int solve(){
priority_queue<node> q;
while(!q.empty())
q.pop();
num[n]=0;
node cur;
cur.cursum=0; cur.nextsum=num[0]; cur.id=0;
q.push(cur);
int cnt=0;
while(cnt<m){
cur=q.top();
q.pop();
if(cur.id>=n)
continue;
q.push(node(cur.cursum,cur.cursum+num[cur.id+1],cur.id+1));
q.push(node(cur.nextsum,cur.nextsum+num[cur.id+1],cur.id+1));
cnt++;
}
for(m=0;!q.empty();m++){
res[m]=q.top().cursum;
q.pop();
}
sort(res,res+m);
return res[m-1];
}
int main(){
//freopen("input.txt","r",stdin);
int t,cases=0;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
sort(num,num+n);
int ans=solve();
printf("Case #%d: %d
",++cases,ans);
}
return 0;
}