贪心 UVALive 6834 Shopping

题目传送门

 1 /*
 2     题意:有n个商店排成一条直线,有一些商店有先后顺序,问从0出发走到n+1最少的步数
 3     贪心:对于区间被覆盖的点只进行一次计算,还有那些要往回走的区间步数*2,再加上原来最少要走n+1步就是答案了
 4     详细解释:http://blog.csdn.net/u013625492/article/details/45640735
 5 */
 6 #include <cstdio>
 7 #include <algorithm>
 8 #include <cstring>
 9 #include <cmath>
10 using namespace std;
11
12 const int MAXN = 1e3 + 10;
13 const int INF = 0x3f3f3f3f;
14 struct A
15 {
16     int l, r;
17 }a[MAXN];
18 struct B
19 {
20     int l, r;
21 }b[MAXN];
22
23 bool cmp(A x, A y)    {return x.l < y.l;}
24
25 int main(void)        //UVALive 6834 Shopping
26 {
27 //    freopen ("C.in", "r", stdin);
28
29     int n, m;
30     while (scanf ("%d%d", &n, &m) == 2)
31     {
32         int cnt = 0;
33         for (int i=1; i<=m; ++i)
34         {
35             int u, v;    scanf ("%d%d", &u, &v);
36             if (u > v)    continue;
37             a[++cnt].l = u;    a[cnt].r = v;
38         }
39         sort (a+1, a+1+cnt, cmp);
40
41         int l = a[1].l;    int r = a[1].r;    int tot = 0;
42         for (int i=2; i<=cnt; ++i)        //区间覆盖
43         {
44             if (r < a[i].l)
45             {
46                 b[++tot].l = l;    b[tot].r = r;
47                 l = a[i].l;    r = a[i].r;
48             }
49             else    r = max (r, a[i].r);
50             if (i == cnt)    {b[++tot].l = l;    b[tot].r = r;}
51         }
52
53         int ans = n + 1;
54         for (int i=1; i<=tot; ++i)    ans += 2 * (b[i].r - b[i].l);
55         printf ("%d\n", ans);
56     }
57
58     return 0;
59 }
时间: 2024-10-10 23:22:30

贪心 UVALive 6834 Shopping的相关文章

贪心 UVALive 6832 Bit String Reordering

题目传送门 1 /* 2 贪心:按照0或1开头,若不符合,选择后面最近的进行交换.然后选取最少的交换次数 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <string> 8 #include <cmath> 9 #include <vector> 10 #include <map> 11 #include &l

LA 6834 Shopping

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4846 题目大意:街道上等距分布着n个商店,编号为1~n,相邻商店之间距离为单位1,某人从初始位置(0点)出发,要在每个商店里买一些物品,且购物时要满足一些诸如先到商店A,再到商店B的限制条件,最后到达出口(n+1点).问此人购物要走的路最短是多少(不包括在商店里的路

UVALive 4731 dp+贪心

这个题首先要利用题目的特性,先贪心,否则无法进行DP 因为求期望的话,越后面的乘的越大,所以为了得到最小值,应该把概率值降序排序,把大的数跟小的系数相乘 然后这种dp的特性就是转移的时候,由 i推到i+1每次添加一个数,就要考虑这个新数应该和谁放在一组,枚举他放在哪一组即可 dp[i][j]代表当前第i个数有j个分组时候的最小值 dp[i][j]=dp[k][j-1]+i(prefix[i]-prefix[k-1]),k代表枚举第几个数开始和当前新添加的数为一组,prefix为前缀和,为了迅速得

【贪心】UVALive 6530——Football

Your favorite football team is playing a charity tournament, which is part of a worldwide fundraising e ort to help children with disabilities. As in a normal tournament, three points are awarded to the team winning a match, with no points to the los

UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)

先从中找出性能最好的那个数, 在用钱比较少的去组合,能组出来就表明答案在mid的右边,反之在左边, #include<string.h> #include<map> #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; map<string,int> vic;//以字符映射数字 int end,start; int num; int

UvaLive 6441 Horrible Quiz 贪心

链接:http://vjudge.net/problem/viewProblem.action?id=47588 题意:刚开始有15000的积分,有N道题,对于每道题,有Ci%的概率答对,有Wi%的概率答错,(100-Ci-Wi)%的概率会选择提供的答案,可以提供的答案中最多可以提供M个错的答案,剩下的都必须是对的,答错的时候,积分*-1,答对的时候积分不变,问可以选择的M题,使可以得到的分数最低的期望是多少. 思路:公式中Ci,Wi分别表示正确和错误的概率(Ci+Wi=1) 对于提供错误答案和

UVALive 6911 Double Swords (Set,贪心,求区间交集)

首先左边的是必须要选的,然后右边的需要注意,有些区间是可以舍掉的.1.区间里有两个不同的A. 2.区间里有一个A,而且这个A不是这个区间对应的A. 这个题我一开始错在了第2个判定条件上,我定义的id记录的是最后一个出现位置,不能进行判断,所以干脆在结构体里记录了他对应的A值. 舍掉后留下的区间,可以按照区间左边界排序,然后求交集即可. 总体来说,贪心的思想还是不难的,就是有一些细节需要注意. 代码如下: #include<iostream> #include<cstdio> #in

UVaLive 6609 Meeting Room Arrangement (贪心,区间不相交)

题意:给定 n 个区间,让你选出最多的区间,使得每个区间不相交. 析:贪心题,贪心策略是按右端点排序,然后按着选即可. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #

UVaLive 6698 Sightseeing Bus Drivers (水题,贪心)

题意:n个工人,有n件工作a,n件工作b,每个工人干一件a和一件b,a[i] ,b[i]代表工作时间,如果a[i]+b[j]>t,则老板要额外付钱a[i]+b[j]-t;现在要求老板付钱最少: 析:贪心策略,让大的和小的搭配,小的和大的搭配,是最优的. #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include &l