Codeforces Round #687 (Div. 2)

A

题意:有一个n*m个牢房的监狱,(r,c)处有一个逃生通道,每一个人一秒可以上下左右移动一格,问最短多少秒所有人可以到逃生通道。

思路:地图四个角一定有一个离(r,c)最远的,取时间最长的那个就是答案。

代码:

#include <bits/stdc++.h>
using namespace std;
#define bug(x) cerr<<#x<<" : "<<x<<endl;
#define x first
#define y second
const int N=2e4+10; 
const int mod=1e9+7;
typedef long long ll;


int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int tt=1;
    cin >> tt;
    while(tt--)
    {
        int n,m,x,y;
        cin >> n >> m >> x >> y;
        cout << max(x-1,n-x)+max(y-1,m-y) << endl;
    }
}

B

题意:有n个房子,每个房子有自己初始颜色。画家每次可以画连续的个房子,可以画成任意颜色,或者不变。问最少画几次可以使所有的房子都变成一样的颜色。

思路:一开始的想法是贪心,把所有房子都变成开始最多颜色的,没看到题目说颜色只有一百种。我们只需要枚举每一种颜色,都刷成这种颜色需要多少天,去最小的的答案,暴力枚举。

代码:

#include <bits/stdc++.h>
using namespace std;
#define bug(x) cerr<<#x<<" : "<<x<<endl;

const int N=2e6+10; 
const int mod=1e9+7;
typedef long long ll;

int a[N];


int main(){
    int T;
    cin>>T;
    while(T--){
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++) cin>>a[i];
        int res=1e9;
        for(int i=0;i<=100;i++){
            queue<int>q;
            for(int j=1;j<=n;j++){
                if(a[j]!=i) q.push(j);
            }

            q.push(1e9);
            int start=q.front();
            q.pop();
            int ans=0;
            while(!q.empty()){
                int x=q.front();
                if(x-start<k){
                    q.pop();
                }
                else{
                    start=x;
                    q.pop();
                    ans++;
                }
            }
            res=min(res,ans);
        }
        cout<<res<<endl;
    }    
}

全部评论

相关推荐

10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务