P6977题解----a little 模拟

· · 题解

题意整理

n 个队列,他们要选 k 个数。选数方案如下。

从前向后遍历所有队列,如果队列为空,那么将数字的总和 sum 加上 50,k 减少 1。

否则,如果 sum \le 队首,将 sum 加上 队首,k 减少 1。

不管咋样,最后将队首出队。

循环以上步骤直到 k=0

题目之解

按题意模拟即可,数据范围小,没有太大的技巧。

代码:

#include<bits/stdc++.h>
using namespace std;
queue<int,list<int> >q[20];//把queue的底层容器从deque换成list,更快 
int n,k,sum;
int main() {
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        int m;
        cin>>m;
        for(int j=1;j<=m;j++){
            int x;
            cin>>x;
            q[i].push(x);
        }
    }
    while(k){//选k道题 
        for(int i=1;i<=n;i++){
            if(k==0) break;
            if(q[i].empty()) sum+=50,k--;
            else if(q[i].front()<sum) q[i].pop();
            else sum+=q[i].front(),q[i].pop(),k--;
        }
    }
    cout<<sum;
    return 0;
}