uva 1203 - Argus

/*
uva  1203 - Argus
题意:统计每次出队列的序号————实际就是一个优先队列优先级为:
当时间小的优先级高或者时间相同,序号小的优先级高(见重载<)
因为时间前进时间累加 在结构体里设三个变量num\time\sum
核心:弄清优先级到底是什么。
开始我当成“横坐标排序 再纵坐标排序”的思想 wa  了改又wa 英语还得继续学习呀!!!
*///AC

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 const int M=10010;//防止runtime error
 7 int s[M][M];
 8 struct Node
 9 {
10     int num;// 序号
11     int time; //单位时间
12     int  sum;//每次在单元时间基础上的累加
13    Node(int x , int y,int z):num(x),time(y),sum(z){}
14    bool operator <(const Node &e)const//重载<
15    {
16        // if(time==e.time)return num>e.num;
17        // return sum>e.sum;
18         return (sum>e.sum || (sum==e.sum && num>e.num));
19         //返回时间少的或者当时间相同时返回序号小的
20    }
21 };
22 priority_queue <Node> q;
23 /////
24 void  f(int n)
25 {
26     int a ,b,c;
27     while(n--)//循环优先队列
28     {
29         Node node =q.top();//去优先级最高的变量
30         q.pop();//该高的优先级元素出队列
31         printf("%d\n",node.num);//输出
32         node.sum+=node.time;//时间累加
33         q.push(Node(node.num,node.time,node.sum));//循环入队列
34     }
35 }
36 int main()
37 {
38     int i,n;
39     char a[10];
40     i=0;
41     while(scanf("%s",&a)!=EOF)
42     {
43         if(a[0]=='#')break;
44         scanf("%d%d",&s[i][0],&s[i][1]);
45         q.push(Node(s[i][0],s[i][1],s[i][1]));//元素入队列
46         i++;
47     }
48     scanf("%d",&n);
49     f(n);
50     return 0;
51 }
52 /*
53 1  4 56
54 1  5  4
55 1  4  56
56 1   5  5
57 1  6  3
58 1  7  56
59 1  4  20
60 #
61 10
62 */

转载于:https://www.cnblogs.com/someonelikeyou/archive/2013/02/20/2918797.html

猜你喜欢

转载自blog.csdn.net/weixin_34210740/article/details/94538663
今日推荐