下面的代码(比较垃圾)在vs2008下有运行错误...我找了很久,终于找到错误...不过不知道什么地方有问题...
1 #include <iostream>
2 #include <queue>
3
4 using namespace std;
5 struct Node
6 {
7 int rate;
8 int index;
9 Node(int r=0,int i=0):rate(r),index(i){};
10 bool operator<(const Node& c)const{
11 if(rate!=c.rate)return rate<c.rate;
12 return index>c.index;
13 };
14 };
15 priority_queue<Node> que1,que2;
16 int main()
17 {
18 int n,t;
19 while(cin>>n>>t){
20 while(!que1.empty())que1.pop();
21 while(!que2.empty())que2.pop();
22 int r;
23 for(int i=1;i<=n;i++){
24 cin>>r;
25 Node tmp(r,i);
26 que1.push(tmp);
27 }
28 if(n==1){
29 for(int i=0;i<t;i++)
30 cout<<r<<endl;
31 continue;
32 }
33 int num=0;
34 while(1){
35 cout<<que1.top().index<<endl;
36 num++;
37 if(num==t)break;
38 int mo=que1.top().rate%(n-1);
39 int ev=(que1.top().rate-mo)/(n-1);
40 que1.top().rate=0;
41 Node tj=que1.top();
42 //tj.rate=0;
43 if(que1.top().index<=mo){
44 que1.pop();
45 while(!que1.empty()){
46 Node tp=que1.top();
47 if(tp.index<=mo+1){
48 tp.rate+=1+ev;
49 }
50 else tp.rate+=ev;
51 que1.pop();
52 que2.push(tp);
53 }
54 que2.push(tj);
55 }
56 else {
57 que1.pop();
58 while(!que1.empty()){
59 Node tm=que1.top();
60 if(tm.index<=mo){
61 tm.rate+=1+ev;
62 }
63 else tm.rate+=ev;
64 que1.pop();
65 que2.push(tm);
66 }
67 que2.push(tj);
68 }
69
70 cout<<que2.top().index<<endl;
71 num++;
72 if(num==t)break;
73
74 mo=que2.top().rate%(n-1);
75 ev=(que2.top().rate-mo)/(n-1);
76 que2.top().rate=0;
77 tj=que2.top();
78 //tj.rate=0;
79 if(que2.top().index<=mo){
80 que2.pop();
81 while(!que2.empty()){
82 Node tp=que2.top();
83 if(tp.index<=mo+1){
84 tp.rate+=1+ev;
85 }
86 else tp.rate+=ev;
87 que2.pop();
88 que1.push(tp);
89 }
90 que1.push(tj);
91 }
92 else {
93 que2.pop();
94 while(!que2.empty()){
95 Node tm=que2.top();
96 if(tm.index<=mo){
97 tm.rate+=1+ev;
98 }
99 else tm.rate+=ev;
100 que2.pop();
101 que1.push(tm);
102 }
103 que1.push(tj);
104 }
105 }
106 }
107 return 0;
108 }
修改后无错误的代码:
1 #include <iostream>
2 #include <queue>
3
4 using namespace std;
5 struct Node
6 {
7 int rate;
8 int index;
9 Node(int r=0,int i=0):rate(r),index(i){};
10 bool operator<(const Node& c)const{
11 if(rate!=c.rate)return rate<c.rate;
12 return index>c.index;
13 };
14 };
15 priority_queue<Node> que1,que2;
16 int main()
17 {
18 int n,t;
19 while(cin>>n>>t){
20 while(!que1.empty())que1.pop();
21 while(!que2.empty())que2.pop();
22 int r;
23 for(int i=1;i<=n;i++){
24 cin>>r;
25 Node tmp(r,i);
26 que1.push(tmp);
27 }
28 if(n==1){
29 for(int i=0;i<t;i++)
30 cout<<r<<endl;
31 continue;
32 }
33 int num=0;
34 while(1){
35 cout<<que1.top().index<<endl;
36 num++;
37 if(num==t)break;
38 int mo=que1.top().rate%(n-1);
39 int ev=(que1.top().rate-mo)/(n-1);
40 //que1.top().rate=0;
41 Node tj=que1.top();
42 tj.rate=0;
43 if(que1.top().index<=mo){
44 que1.pop();
45 while(!que1.empty()){
46 Node tp=que1.top();
47 if(tp.index<=mo+1){
48 tp.rate+=1+ev;
49 }
50 else tp.rate+=ev;
51 que1.pop();
52 que2.push(tp);
53 }
54 que2.push(tj);
55 }
56 else {
57 que1.pop();
58 while(!que1.empty()){
59 Node tm=que1.top();
60 if(tm.index<=mo){
61 tm.rate+=1+ev;
62 }
63 else tm.rate+=ev;
64 que1.pop();
65 que2.push(tm);
66 }
67 que2.push(tj);
68 }
69
70 cout<<que2.top().index<<endl;
71 num++;
72 if(num==t)break;
73
74 mo=que2.top().rate%(n-1);
75 ev=(que2.top().rate-mo)/(n-1);
76 //que2.top().rate=0;
77 tj=que2.top();
78 tj.rate=0;
79 if(que2.top().index<=mo){
80 que2.pop();
81 while(!que2.empty()){
82 Node tp=que2.top();
83 if(tp.index<=mo+1){
84 tp.rate+=1+ev;
85 }
86 else tp.rate+=ev;
87 que2.pop();
88 que1.push(tp);
89 }
90 que1.push(tj);
91 }
92 else {
93 que2.pop();
94 while(!que2.empty()){
95 Node tm=que2.top();
96 if(tm.index<=mo){
97 tm.rate+=1+ev;
98 }
99 else tm.rate+=ev;
100 que2.pop();
101 que1.push(tm);
102 }
103 que1.push(tj);
104 }
105 }
106 }
107 return 0;
108 }
原因分析(个人):vs08有检查机制,当对pq顶部直接改没问题,但是又调用pop的时候,其实现在的堆已不是正常的
了。所以回出现错误,而03下没检查机制,所以不会出现错误.如果想对pq的顶部改时,好的习惯是先弹出,修改后再压回去...
posted on 2008-07-22 19:18
小果子 阅读(125)
评论(0) 编辑 收藏 引用 所属分类:
学习笔记