1 /* 2 贪心:官方题解: 3 首先我们考虑如何选择最左边的一个区间 4 假设最左边的区间标号是i, 那选择的另外两个区间的左端点必定要大于Ri 5 若存在i之外的j, 满足Rj<Ri, 那么另外两个区间的选择余地必定不会减少 6 因此,为了使另外两个区间有尽可能多的选择,我们选择一个右端点最小的区间作为最左边的区间是最好的 7 同理,我们选择一个左端点最大的区间作为最右边的区间,也将提供最多的选择 8 确定了这两个区间之后,只需判断是否存在一个区间位于它们中间且不交叉即可 9 本题的取模值十分特殊,用unsigned int的自然溢出可以达到同样的效果 10 时间复杂度O(N) 11 解题关键:if (mn_r < node[i].l && node[i].r < mx_l),存在这样的一个区间满足条件就YES! 12 反思:首先没有想到贪心的投机方法,用暴力DFS搜索超时,unsigned int的范围: 0 ~ 4294967295 这个取模自然溢出也是醉了:) 13 补充:HDOJ 2037 今年暑假不AC 升级版 14 */ 15 #include <cstdio> 16 #include <iostream> 17 #include <algorithm> 18 #include <cstring> 19 #include <string> 20 #include <map> 21 #include <vector> 22 #include <set> 23 #include <cmath> 24 #include <queue> 25 using namespace std; 26 const int MAXN = 10000000 + 10; 27 const long long INF = 0x3f3f3f3f; 28 struct Node 29 { 30 unsigned int l, r; 31 }node[MAXN]; 32 33 int main(void) //赛码 1001 Movie 34 { 35 //freopen ("A.in", "r", stdin); 36 37 int t, n; 38 unsigned int a, b, c, d; 39 scanf ("%d", &t); 40 while (t--) 41 { 42 scanf ("%d%d%d%d%d%d%d", &n, &node[1].l, &node[1].r, &a, &b, &c, &d); 43 44 for (int i=2; i<=n; ++i) 45 { 46 node[i].l = node[i-1].l * a + b; 47 node[i].r = node[i-1].r * c + d; 48 } 49 for (int i=1; i<=n; i++) 50 { 51 if (node[i].l > node[i].r) swap (node[i].l, node[i].r); 52 } 53 54 unsigned int mn_r = 4294967295UL, mx_l = 0; 55 for (int i=1; i<=n; ++i) 56 { 57 if (mn_r > node[i].r) mn_r = node[i].r; 58 if (mx_l < node[i].l) mx_l = node[i].l; 59 } 60 61 if (mn_r > mx_l) 62 { 63 puts ("NO"); continue; 64 } 65 66 bool flag = false; 67 for (int i=1; i<=n; ++i) 68 { 69 if (mn_r < node[i].l && node[i].r < mx_l) 70 { 71 flag = true; puts ("YES"); break; 72 } 73 } 74 if (!flag) puts ("NO"); 75 } 76 77 return 0; 78 }
1 /* 2 贪心水题 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 const int MAXN = 1e2 + 10; 10 const int INF = 0x3f3f3f3f; 11 struct Node 12 { 13 int l, r; 14 }node[MAXN]; 15 16 bool cmp(Node x, Node y) 17 { 18 if (x.r == y.r) return x.l < y.l; 19 20 return x.r < y.r; 21 } 22 23 int main(void) //HDOJ 2037 今年暑假不AC 24 { 25 //freopen ("HDOJ_2037.in", "r", stdin); 26 27 int n; 28 while (scanf ("%d", &n) == 1) 29 { 30 if (n == 0) break; 31 32 if (n == 1) 33 { 34 puts ("1"); continue; 35 } 36 37 for (int i=1; i<=n; ++i) 38 { 39 scanf ("%d%d", &node[i].l, &node[i].r); 40 if (node[i].l > node[i].r) swap (node[i].l, node[i].r); 41 } 42 43 sort (node+1, node+1+n, cmp); 44 45 int cnt = 1; 46 int tmp = node[1].r; 47 for (int i=2; i<=n; ++i) 48 { 49 if (node[i].l >= tmp) 50 { 51 tmp = node[i].r; ++cnt; 52 } 53 } 54 55 printf ("%d\n", cnt); 56 } 57 58 return 0; 59 }
HDOJ 2037 今年暑假不AC
时间: 2024-11-05 16:34:45