Codeforces Round #614 (Div. 2) A - ConneR and the A.R.C. Markland-N

原题题面:https://codeforces.com/contest/1293/problem/A

题目大意:

ConneR老师想吃东西,他现在在大楼的第s层,大楼总共有n层,但是其中有k层的餐厅关门了。

然后给了这k层关门的餐厅分别所在的楼层。

所以问ConneR老师最少得往上(或者往下)走几层楼,才能到最近的还开门的餐厅就餐?

解题思路1:

对于关闭的k层,存在数组a里排序。(放在1~k的位置)

先循环一遍数组a,看看s层是否存在于a数组里,如果不存在,直接输出0作为答案。

如果存在,开始找答案楼层。

数组a第0的位置赋值0,第k+1的位置赋值n+1。(后面的思路计算中有需要)

然后i从0开始循环到k,每次判断a[i+1]-a[i]是否大于1。

如果大于1,说明a[i+1]与a[i]之间存在着开放的楼层可以成为目的地。

可以取a[i]+1和a[i+1]-1两个楼层进行判断。(因为s层此时是存在于数组a内的,所以最佳答案楼层一定是相邻于某个元素的,不想写那么多判断条件的话直接无脑判断这两个楼层好了,小贪心一下)

最后输出最优解即可。

 1 /*
 2 Written By. StelaYuri
 3 On 2020/01/19
 4 */
 5 #include<bits/stdc++.h>
 6 using namespace std;
 7 int a[1050];
 8 void solve(){
 9     int n,s,k,d,i,p,ans;
10     cin>>n>>s>>k;
11     for(i=1;i<=k;i++)
12         cin>>a[i];
13     sort(a+1,a+1+k);
14     a[0]=0;
15     a[k+1]=n+1;
16     ans=10000;
17     bool flag=true;
18     for(i=0;i<=k;i++){
19         if(a[i]==s||a[i+1]==s)
20             flag=false;
21         if(a[i+1]-a[i]>1){
22             ans=min(ans,abs(s-a[i+1]+1));
23             ans=min(ans,abs(s-a[i]-1));
24         }
25     }
26     if(flag)
27         ans=0;
28     cout<<ans<<endl;
29 }
30 int main(){
31     int T;
32     cin>>T;
33     while(T--)
34         solve();
35
36     return 0;
37 }

解题思路2:

同样的,排序后先循环一遍数组a,看看s层是否存在于a数组里,如果不存在,直接输出0作为答案。

如果存在,因为只有连续的几层楼相邻关闭的时候才会使答案增大。

所以从s层开始,向上向下都搜一遍最少走几层能到a[i+1]-a[i]大于1的楼层。(即这两层楼之间一定有楼层是开放的)

 1 /*
 2 Written By. StelaYuri
 3 On 2020/01/20
 4 */
 5 #include<bits/stdc++.h>
 6 using namespace std;
 7 int a[1050];
 8 void solve(){
 9     int n,s,k,i,p,sp,ans;
10     cin>>n>>s>>k;
11     bool flag=true;
12     for(i=1;i<=k;i++){
13         cin>>a[i];
14         if(a[i]==s)
15             flag=false;
16     }
17     if(flag){
18         cout<<0<<endl;
19         return;
20     }
21     sort(a+1,a+k+1);
22     sp=find(a+1,a+1+k,s)-a;
23     a[0]=0;
24     a[k+1]=n+1;
25     ans=10000;
26     for(i=sp;i<=k;i++)
27         if(a[i+1]-a[i]>1){
28             ans=min(ans,a[i]+1-s);
29             break;
30         }
31     for(i=sp;i;i--)
32         if(a[i]-a[i-1]>1){
33             ans=min(ans,s-(a[i]-1));
34             break;
35         }
36     cout<<ans<<endl;
37 }
38 int main(){
39     ios::sync_with_stdio(0);
40     cin.tie(0);cout.tie(0);
41     int T;
42     cin>>T;
43     while(T--)
44         solve();
45
46     return 0;
47 }

原文地址:https://www.cnblogs.com/stelayuri/p/12216101.html

时间: 2024-08-30 15:36:33

Codeforces Round #614 (Div. 2) A - ConneR and the A.R.C. Markland-N的相关文章

Codeforces Round #614 (Div. 2) D. Aroma&#39;s Search

题目链接:http://codeforces.com/contest/1293/problem/D 题意: 给定x0,y0,ax,ay,bx,by 即一堆经验点:(x0,y0),(x1,y1)等价于(ax*x0+bx,ay*y0+by),(x2,y2)等价于(ax*x1+bx,ay*y1+by),(x3,y3)等价于(ax*x2+bx,ay*y2+by)...... 再给定xs,ys,t 即起点(xs,ys),时间t 上下左右每走一步都需要1单位时间,问在t时间内,从起点出发最多可以吃到多少个经

Codeforces Round #614 (Div. 2) C. NEKO&#39;s Maze Game

题目链接:http://codeforces.com/contest/1293/problem/C 题意:给定n,q,即给定一个2*n的格子,有q个查询. 每个查询给定一个ri和ci,ri为1或2,ci在1到n之间,即给定一个(ri,ci),该点自该查询起状态进行转变(可经过/不可经过). 如某个查询给定1,2,即点(1,2)无法经过,若之后查询再次给定1,2,则该点(1,2)可以经过. 问能否从(1,1)走到(2,n),保证给定的查询不会经过起点和终点. 思路: 由于n和q最大都是1e5,所以

Codeforces Round #614 (Div. 2) E. Xenon&#39;s Attack on the Gangs

On another floor of the A.R.C. Markland-N, the young man Simon "Xenon" Jackson, takes a break after finishing his project early (as always). Having a lot of free time, he decides to put on his legendary hacker "X" instinct and fight ag

Codeforces Round #614 (Div. 2) A( A - ConneR and the A.R.C. Markland-N)

A - ConneR and the A.R.C. Markland-N 题目链接:http://codeforces.com/contest/1293/problem/A 题意:一栋楼房有n(1~n)层,有个人身处s楼,现在想要到餐厅吃饭,可是现在有k个餐厅关闭的,问你该人至少爬几层楼梯才能到开放的餐厅吃饭 思路:...这题暴力没戏..又是超时又是超内存...分两种,一个是往上找出最小的i-s即可,一个是往下找,找出最小的s-i即可,,用了数组还是超时..用了map就过了 // // Crea

Codeforces Round #614 (Div. 2)

A. ConneR and the A.R.C. Markland-N 题目链接:https://codeforces.com/contest/1293/problem/A 题意: 有一个长为 n 的楼层,其中有 k 个楼层没有餐厅 ,你现在在 s 层,问你最少走多少个楼层可以到达餐厅吃饭 分析: 因为 k 只有 1000,所以直接往 s 层上下方找(当找到 0 或者 n + 1 时说明这个方向没有答案) #include<bits/stdc++.h> using namespace std;

Codeforces Round #614 (Div. 2) B - JOE is on TV!

原题题面:https://codeforces.com/contest/1293/problem/B 解题思路: Σi=1~n 1/i ??? 1 /* 2 Written By. StelaYuri 3 On 2020/01/19 4 */ 5 #include<bits/stdc++.h> 6 using namespace std; 7 typedef long long ll; 8 int a[1005],b[1005]; 9 void solve(){ 10 int n,i; 11

Codeforces Round #614 (Div. 2) 比赛总结

比赛情况 怒切 \(A,B,C,D\),后面 \(E,F\) 两题技术太菜不会做,不知道什么时候可以补起来. 比赛总结 事实证明: 比赛前喝一瓶抗疲劳饮料对比赛状态的进入有显著效果. 比赛有人陪着打对AC题目有显著效果. 说正经的: 不要紧张,也不要太过放松.这样才有利于发挥出真实水平. 下面就开始 喜闻乐见 的题解吧. A 入门题 枚举找到最近的可用楼层即可.用 \(STL\) 里面的 map 判断一个楼层是否可用使用. Code #include<bits/stdc++.h> #defin

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿