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; }