码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷P2294 [HNOI2005]狡猾的商人 ,神奇做法——贪心

时间:2017-07-11 15:56:43      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:一点   思路   运算   实现   top   链接   部分   多重循环   return   

                           HNOI2005狡猾的商人,洛谷链接 原题入口

  看到大牛都是写的差分约束或带权并查集,本蒟蒻都不太会(还是用差分约束过了的QAQ),但是想出一种贪心的策略,运用神奇的优先队列实现。思路是:先按左端点为第一排序关键字,再排右端点。之后就开始两两比较,如果左端点相等,就比较右端点,如果相等,就比较值,如果值不同,就直接输出false,否则输出true,如果右端点不等,就把相同的部分抵消掉,把新的区间再压入优先队列。直到不能操作,就输出true。下附代码:

 1 #include<queue>
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define N 1100
 8 using namespace std;
 9 inline void read(int &x)
10 {
11     x=0;
12     int p=1;
13     char c=getchar();
14     while(!isdigit(c)){if(c==-)p=-1;c=getchar();}
15     while(isdigit(c)) {x=(x<<1)+(x<<3)+(c^0);c=getchar();}
16     x*=p;
17 
18 }//快速读入
19 
20 int n,m;
21 struct node
22 {
23     int l,r,s;
24     bool operator < (const node &h)const
25     {
26         if(l!=h.l)return l>h.l;
27         return r>h.r;
28 
29 }//重载运算符,确定优先队列的优先级
30 
31 }tmp;
32 priority_queue<node>q;
33 int main()
34 {
35     int t;
36     read(t);
37     while(t--)
38     {    
39         while (!q.empty()) q.pop();//多组数据清空
40         read(n);read(m);
41         if(m==1){printf("true\n");continue;}//其实没必要特判,只是优化一点点
42         for(int i=1;i<=m;i++)
43         {
44             int l,r,s;
45             read(tmp.l);read(tmp.r);read(tmp.s);
46             q.push(tmp);
47         }
48         tmp=q.top();//取出第一个
49         q.pop();
50         while(!q.empty())
51         {    
52             node tmp1;
53             tmp1=q.top();
54             q.pop();
55             if(tmp.l==tmp1.l)
56             {
57                 if(tmp.r==tmp1.r)
58                 {
59                     if(tmp.s!=tmp1.s)
60                     {printf("false\n");goto end;}//退出多重循环的小操作
61                 }
62                 else 
63                 if(tmp.r<tmp1.r)
64                     q.push((node) {tmp.r+1, tmp1.r, tmp1.s - tmp.s});//将抵消后的部分放入队列
65             }
66             tmp = tmp1;//继续比
67         }
68         printf("true\n");
69         end:;
70     }
71     return 0;
72 }

 

洛谷P2294 [HNOI2005]狡猾的商人 ,神奇做法——贪心

标签:一点   思路   运算   实现   top   链接   部分   多重循环   return   

原文地址:http://www.cnblogs.com/peng-ym/p/7150612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!