zoukankan      html  css  js  c++  java
  • Codeforces 1293A

    题目大意:

    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内的,所以最佳答案楼层一定是相邻于某个元素的,不想写那么多判断条件的话直接无脑判断这两个楼层好了,小贪心一下)

    最后输出最优解即可。

    #include<bits/stdc++.h>
    using namespace std;
    int a[1050];
    void solve(){
        int n,s,k,d,i,p,ans;
        cin>>n>>s>>k;
        for(i=1;i<=k;i++)
            cin>>a[i];
        sort(a+1,a+1+k);
        a[0]=0;
        a[k+1]=n+1;
        ans=10000;
        bool flag=true;
        for(i=0;i<=k;i++){
            if(a[i]==s||a[i+1]==s)
                flag=false;
            if(a[i+1]-a[i]>1){
                ans=min(ans,abs(s-a[i+1]+1));
                ans=min(ans,abs(s-a[i]-1));
            }
        }
        if(flag)
            ans=0;
        cout<<ans<<endl;
    }
    int main(){
        int T;
        cin>>T;
        while(T--)
            solve();
        
        return 0;
    }

    解题思路2:

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

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

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

    #include<bits/stdc++.h>
    using namespace std;
    int a[1050];
    void solve(){
        int n,s,k,i,p,sp,ans;
        cin>>n>>s>>k;
        bool flag=true;
        for(i=1;i<=k;i++){
            cin>>a[i];
            if(a[i]==s)
                flag=false;
        }
        if(flag){
            cout<<0<<endl;
            return;
        }
        sort(a+1,a+k+1);
        sp=find(a+1,a+1+k,s)-a;
        a[0]=0;
        a[k+1]=n+1;
        ans=10000;
        for(i=sp;i<=k;i++)
            if(a[i+1]-a[i]>1){
                ans=min(ans,a[i]+1-s);
                break;
            }
        for(i=sp;i;i--)
            if(a[i]-a[i-1]>1){
                ans=min(ans,s-(a[i]-1));
                break;
            }
        cout<<ans<<endl;
    }
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
        int T;
        cin>>T;
        while(T--)
            solve();
        
        return 0;
    }
  • 相关阅读:
    Leetcode 乘积最大子数组 (两种思路)
    C++string函数库-->to_string
    Zigzags CodeForces
    石子游戏(Leetcode每日一题)
    树形dp入门题(Leetcode 337. 打家劫舍 III)
    E
    背包九讲
    通过树状dp来求树的直径
    329. 矩阵中的最长递增路径(Leetcode每日一题)
    关于图的匹配,边覆盖,独立集,顶点覆盖
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12216101.html
Copyright © 2011-2022 走看看