CodeForces 709B Checkpoints 模拟

题目大意:给出n个点的坐标,和你当前的坐标,求走过n-1个点的最短路程。

题目思路:走过n-1个点,为了使路程更短,那么不走的点只可能第一个点或最后一个点。模拟就行了,比较恶心。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 #include<queue>
 8 #include<math.h>
 9 #include<map>
10 #define INF 0x3f3f3f3f
11 #define MAX 10000005
12 #define Temp 1000000000
13
14 using namespace std;
15
16 long long a[MAX];
17
18 int main()
19 {
20     int n,k,index,i,d;
21     long long lsum1,rsum1,lsum2,rsum2;
22     while(scanf("%d%d",&n,&k)!=EOF)
23     {
24         index=-1;
25         for(int i=1;i<=n;i++)
26             scanf("%lld",&a[i]);
27         sort(a+1,a+n+1);
28         if(n==1)//如果只有一个点,输出0
29         {
30             printf("0\n");
31             continue;
32         }
33         if(k<=a[1])//如果起始坐标在最左边,则达到第n-1个点结束
34         {
35             printf("%lld\n",a[n-1]-k);
36             continue;
37         }
38         else if(k>=a[n])//如果起始坐标在最右边,则到达第二个点结束
39         {
40             printf("%lld\n",k-a[2]);
41             continue;
42         }
43         else if(n==2)//如果只有两个点
44         {
45             long long ans=min(k-a[1],a[2]-k);
46             printf("%lld\n",ans);
47         }
48         else
49         {
50             for(int i=1;i<=n;i++)
51             {
52                 if(a[i]>k)
53                 {
54                     index=i-1;
55                     break;
56                 }
57             }
58             if(index>=n-1)
59             {
60                 lsum1=(k-a[1]);//不拿N点
61                 lsum2=(a[n]-k)*2+(k-a[2]);//不拿1点
62                 rsum1=(k-a[2])*2+(a[n]-k);//不拿1点
63                 long long ans=min(min(lsum1,lsum2),rsum1);
64                 printf("%lld\n",ans);
65                 continue;
66             }
67
68             else if(index<=2)
69             {
70                 lsum1=(a[n]-k);//不拿1
71                 lsum2=(k-a[1])*2+(a[n-1]-k);//不拿n
72                 rsum1=(a[n-1]-k)*2+(k-a[1]);//不拿n
73                 long long ans=min(min(lsum1,lsum2),rsum1);
74                 printf("%lld\n",ans);
75                 continue;
76             }
77             lsum1=(k-a[1])*2+(a[n-1]-k);
78             lsum2=(a[n-1]-k)*2+(k-a[1]);
79             rsum1=(k-a[2])*2+(a[n]-k);
80             rsum2=(a[n]-k)*2+(k-a[2]);
81             long long ans=min(min(rsum1,rsum2),min(lsum1,lsum2));
82             printf("%lld\n",ans);
83         }
84     }
85     return 0;
86 }

时间: 2024-10-01 13:08:27

CodeForces 709B Checkpoints 模拟的相关文章

CodeForces 709B Checkpoints

分类讨论. 先对$n$个坐标进行排序.如果$a$在$x[1]$左边,那么肯定是$x[n]$不走.如果$a$在$x[n]$右边,那么$x[1]$不走. 剩下的讨论一下是$x[1]$不走还是$x[n]$不走,几种情况都算一下取最小值即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #i

CodeForces 709B Checkpoints (数学,最短路)

题意:给定你的坐标,和 n 个点,问你去访问至少n-1个点的最短路是多少. 析:也是一个很简单的题,肯定是访问n-1个啊,那么就考虑从你的位置出发,向左访问和向右访问总共是n-1个,也就是说你必须从1 - n-1 全访问一次, 或者是2 - n 全访问一次,有一段是访问了两次,加上就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <s

Checkpoints codeforces 709B

http://codeforces.com/problemset/problem/709/B 题意:给出一条横向坐标轴,给出Vasya所在的坐标位置及其另外n个坐标.Vasya想要至少访问n-1个位置,问最短所需要走的距离为多少? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> using namespace std; #define maxn 1

codeforces 591B Rebranding (模拟)

Rebranding Problem Description The name of one small but proud corporation consists of n lowercase English letters. The Corporation has decided to try rebranding - an active marketing strategy, that includes a set of measures to change either the bra

Codeforces 389B(十字模拟)

Fox and Cross Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status Description Fox Ciel has a board with n rows and n columns. So, the board consists of n × n cells. Each cell contains either a symbol '.', or a s

CodeForces 697B Barnicle 模拟

强行模拟 纪念一下…… 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string> 7 #include<map> 8 #include<vector> 9 #include<queue> 10 #define M(a

CodeForces - 344A Magnets (模拟题)

CodeForces - 344A Magnets Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status Description Mad scientist Mike entertains himself by arranging rows of dominoes. He doesn't need dominoes, though: he uses rectangula

CodeForces 670E(模拟双向链表)

题意:给你一串合法的括号和当前光标的位置和一些操作,问操作完之后的串是怎么样的 思路:模拟一个双向链表的操作,首先先预处理出配对的括号组,然后模拟即可 #include<bits\stdc++.h> using namespace std; const int maxn = 1e6; struct Node { int l,r; }nodes[maxn]; char s1[maxn],s2[maxn]; int a[maxn],d[maxn]; int main() { int n,m,pos

Berland National Library codeforces 567B(模拟)

http://codeforces.com/problemset/problem/567/B 题意:图书馆有一个程序,可以记录学生的进出情况,'+'表示进入,'-'表示出去,字符后面的数字表示学生的编号.在这个程序尚未启动前,还有一些同学进的消息没有被记录下来.现在问你这个图书馆至少得容纳多少学生. 分析:用sum和ans两个值来记录,sum存当前房间人数,ans维护最大值. #include <iostream> #include <stdio.h> #include <s