- 问题描述
-
Mr.Cai want to send TT a bouquet of the most beautiful flowers.
Mr.Cai have buy K bouquets of flowers from the shop.
When Mr.Cai get the bouquet of flowers that will sorted in descending order by their beautiful value.
And Mr.Cai want pick up H flowers from the K bouquets to make up the most beautiful bouquet flowers. - 输入
-
There are muti-case.
First line contain two integers K (0 < K <= 1000) and H (0 < H <= 1000)
Then there are K lines.
For each lines, the first number Ni (0 < Ni <= 10000) means the bouquet of flowers contains Ni flowers.
the following Ni numbers means the flower's beautiful value Vi (0 < Vi <= 100000).
The H is less than the sum of all Ni.
- 输出
-
For each case, print the most beautiful flowers's beatiful value.
- 样例输入
-
2 3 3 3 2 1 3 6 5 4 2 4 3 4 2 1 3 3 2 1
- 样例输出
-
15 11
- 提示
-
无
- 来源
-
Monkeyde17
题意:输入 h k
表示h行 每行 第一个数m 其后跟m个数字
问这些数字中取k个 问和最大为多少?
思路:
由于 只有444k的内存 所以要用到 优先队列 保持k个数
但是 我的却一直超时 看了别人的解题报告才知道 语句中多很多判断 比入队出队要耗的时间少很多 也就是 本题的主要耗时间的地方时入队出队
下面是AC 代码 最后面是TLE的
AC
#include<stdio.h>
#include<stdlib.h>
#include<queue>
using namespace std;
int main()
{
int h,i,j,n,k;
while(scanf("%d %d",&k,&h)!=EOF)
{
priority_queue<int,vector<int>,greater<int> >que;
while(k--)
{
scanf("%d",&n);
int num;
while(n--)
{
scanf("%d",&num);
if(que.size()<h)
que.push(num);
else
if(que.size()>=h&&num>que.top()) {que.pop();que.push(num);}
}
}
int sum=0;
while(que.size()>h) que.pop();
while(!que.empty())
{
sum+=que.top();
que.pop();
}
printf("%d\n",sum);
}
return 0;
}
TLE
#include<stdio.h>
#include<stdlib.h>
#include<queue>
using namespace std;
int main()
{
int h,i,j,n,k;
while(scanf("%d %d",&k,&h)!=EOF)
{
priority_queue<int,vector<int>,greater<int> >que;
while(!que.empty())
{
que.pop();
}
while(k--)
{
scanf("%d",&n);
int num;
while(n--)
{
scanf("%d",&num);
que.push(num);
if(que.size()>h) que.pop();
}
}
int sum=0;
while(que.size()>h) que.pop();
while(!que.empty())
{
sum+=que.top();
que.pop();
}
printf("%d\n",sum);
}
return 0;
}
上面的 AC的982ms
下面处理了下 就200ms
#include<stdio.h>
#include<stdlib.h>
#include<queue>
using namespace std;
int getval()
{
int ret(0);
char c;
while((c=getchar())==' '||c=='\n'||c=='\r');
ret=c-'0';
while((c=getchar())!=' '&&c!='\n'&&c!='\r')
ret=ret*10+c-'0';
return ret;
}
int main()
{
int h,i,j,n,k;
while(scanf("%d %d",&k,&h)!=EOF)
{
priority_queue<int,vector<int>,greater<int> >que;
while(k--)
{
scanf("%d",&n);
int num;
while(n--)
{
num=getval();
if(que.size()<h)
que.push(num);
else
if(que.size()>=h&&num>que.top()) {que.pop();que.push(num);}
}
}
int sum=0;
while(que.size()>h) que.pop();
while(!que.empty())
{
sum+=que.top();
que.pop();
}
printf("%d\n",sum);
}
return 0;
}