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

                      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 }
时间: 2024-10-25 19:23:56

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

P2294 [HNOI2005]狡猾的商人

题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断.每组数据的第一行为两个正整数n和m,其中n < 100,m < 1000,分别表示对应的账本记录了多少个月的收入情况以及偷看了多少次账本.接下来的m行表示刁姹偷看m次账本后记住的m条信息,每条信息占一行,有三个整数s,t和v,表示从第s个月到第t个月(包含第t个月)的总收入为v,这里假设s总是小于等于t. 输出格式: 输出文件out

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

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

BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )

好像很多人用并查集写的... 前缀和, 则 sumt - sums-1 = v, 拆成2条 : sumt ≤ sums-1 + v, sums-1 ≤ sumt - v 就是一个差分约束, 建图跑SPFA.. 想起之前codeVS某场月赛T1有些人用带权并查集..然而我是差分约束水过去的... ------------------------------------------------------------------------------ #include<cstdio> #incl

BZOJ1202 [HNOI2005]狡猾的商人 并查集维护前缀和

1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1935  Solved: 936[Submit][Status][Discuss] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai 元

1202: [HNOI2005]狡猾的商人

1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1554  Solved: 745[Submit][Status] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai 元.所谓一段时间内的

bzoj 1202: [HNOI2005]狡猾的商人 并查集好题

1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2946  Solved: 1384[Submit][Status][Discuss] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai

bzoj 1202: [HNOI2005]狡猾的商人(并查集+前缀和)

1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2573  Solved: 1209 [Submit][Status][Discuss] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损A

bzoj1202: [HNOI2005]狡猾的商人(并查集 差分约束)

1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4127  Solved: 1981[Submit][Status][Discuss] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai

bzoj1202: [HNOI2005]狡猾的商人(差分约束)

1202: [HNOI2005]狡猾的商人 题目:传送门 题解: 据说是带权并查集!蒟蒻不会啊!!! 可是听说lxj大佬用差分约束A了,于是开始一通乱搞. 设s[i]为前i个月的总收益,那么很容易就可以推出约束条件了啊:  s[x-1]>=s[y]-c s[y]>=s[x-1]+c 然后就可以去跑最长路了 吐槽: lxj大佬推出来的条件竟然是两个小于等于号:s[x-1]<=s[y]-c s[y]<=s[x-1]+c 然后跑最短路也A了,表示很玄学qwq 代码: 1 #include