题目如下:
AC代码如下:使用了优先队列,栈。
#include<bits/stdc++.h>
using namespace std;
#define v 5020
typedef struct{
string name; int left_num; int count;
}Node;
struct cmp{
bool operator()(const Node&a, const Node&b){
return a.left_num < b.left_num;
}
};
stack<int>s;
priority_queue<int>q_ls;
priority_queue<Node, vector<Node>, cmp>pq;
int main()
{
int n, c, sum=0;
cin>>n>>c;
Node cur;
string rem[v];
for(int i=0; i<n; i++)
{
cin>>cur.name>>cur.left_num; cur.count = 0;
pq.push(cur); rem[i] = cur.name;
}
while(pq.top().left_num != 0)
{
cur = pq.top(); pq.pop();
if(cur.left_num >= c)
{
cur.count++; cur.left_num-=c; sum++;
}
else{//cur.left_num < c
if(q_ls.empty())//q_ls为空
{
int help = c-cur.left_num;
q_ls.push(help); //cout<<help<<" test "<<q_ls.top()<<" "<< cur.left_num<<" "<<q_ls.size()<<" pq.top().left_num: "<<pq.top().left_num << endl;
cur.count++; cur.left_num=0; sum++;
}
else if(cur.left_num > q_ls.top())//如果 n<C,且找不到任何非空的、剩余空位数大于等于 n 的赛场了,
{
int help = c-cur.left_num; q_ls.push(help);
cur.count++; cur.left_num=0; sum++;
}
else{//cur.left_num <= q_ls.top()
while(1)
{
s.push(q_ls.top()); q_ls.pop();
if(q_ls.empty())
{
int h = s.top(); s.pop();
if(h != cur.left_num)
{
q_ls.push(h - cur.left_num);
}
cur.left_num = 0;
cur.count++;
break;
}
if(cur.left_num > q_ls.top())
{
if(cur.left_num != s.top())
{
q_ls.push(s.top() - cur.left_num);
}
cur.left_num = 0;
cur.count++;
s.pop(); break;
}
}
while(!s.empty())
{
q_ls.push(s.top()); s.pop();
}
}
}
pq.push(cur);
}
Node re[v];
for(int i=0; i<n; i++)
{
re[i] = pq.top(); pq.pop();
}
for(int i=0; i<n; i++)//rem
{
for(int j=0; j<n; j++)//re
{
if(rem[i] == re[j].name)
{
cout<<re[j].name<<" "<<re[j].count<<endl; break;
}
}
}
cout<<sum;
return 0;
}
心得:
易错点:
1. 排空: stack,queue等在访问其值之前一定要先排除其为空的情况啊啊啊
2.程序涉及多个变量时,确保每一阶段操作中,相关所有变量都被考虑到值的变化情况,勿漏勿漏
查错方式:
1. 在程序的关键结点处输出重要变量的值,从而在运行结果中体现
2.在自己通篇看过仍找不出错误时,调试是个好方法~
~ ღ ʕ̡̢̡•̫͡•ʔ̢̡̢ ღ ~
~希望对你有启发~