• 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;
    }
  • 相关阅读:
    POJ 3268 Silver Cow Party (Dijkstra)
    怒学三算法 POJ 2387 Til the Cows Come Home (Bellman_Ford || Dijkstra || SPFA)
    CF Amr and Music (贪心)
    CF Amr and Pins (数学)
    POJ 3253 Fence Repair (贪心)
    POJ 3069 Saruman's Army(贪心)
    POJ 3617 Best Cow Line (贪心)
    CF Anya and Ghosts (贪心)
    CF Fox And Names (拓扑排序)
    mysql8.0的新特性
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12216101.html
Copyright © 2020-2023  润新知