Codeforces Round #614 (Div. 2) A - ConneR and the A.R.C. Markland-N
Posted stelayuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于Codeforces Round #614 (Div. 2) A - ConneR and the A.R.C. Markland-N的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #614 (Div. 2)
Codeforces Round #614 (Div. 2)
Codeforces Round #614 (Div. 2)