Educational Codeforces Round 45 (Rated for Div. 2) B. Micro-World

  1. 题目描述:
    B.微观世界
    你有一个细菌培养皿现在你打算研究这儿难以观察的微观世界,但是不幸的是
    在你的周围咩有任何的显微镜,所以你无法观察他们。
    你知道在培养皿里有多少个细菌,和培养皿的尺寸,同时你也知道银河间的正
    整数常量K。
    如果满足ai>aj且ai<=aj+K则第i个细菌将吞并第j个细菌。第j个细菌将会消失
    但是第i个细菌不会改变它的尺寸。细菌可以表现出多种吞并方式。每一种吞并
    操作满足第i个细菌可以吞并第j个细菌,如果ai>aj且ai<=aj+K.吞并操作一个接
    一个。
    例如,细菌a的序列:a=[101,53,42,102,101,55,54]且K=1。
    其中一种可能的吞并序列为:[101,53,42,102,101,55,54]->
    [101,53,42,10,55,54]->[101,42,102,55,54]->[42,102,55,54]
    ->[42,102,55].最后会剩余三个细菌在培养皿里面。
    因为你没有显微镜,所以你只能猜如果你用显微镜观察,最终可能剩余的最少的细
    菌的数量。
    输入:
    第一行包含两个被空格分开的正整数n和K(1<=n<=2e5,1<=K<=1e6)——细菌的
    数量和间隙常量。
    第二行是n个整数a1,a2,…..an(1<=ai<=1e6)给你的细菌的大小。
    提示:
    第一个案例在题目的描述中已经很清晰了。
    第二个样例中一个可选择的吞并顺序为:。。。。。。。
    第三个样例中没有一个喜欢可以吞并任何一个细菌。
  2. 题目链接:http://codeforces.com/contest/990/problem/B

  3. 通过的代码(1,nlog(n)的做法)

#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+6;
int a[N],n,k,vis[N];
int main(){
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>n>>k;int ans=0;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        int pos=upper_bound(a+i+1,a+1+n,a[i])-a;
        if(pos>n)continue;
        if(a[i]+k>=a[pos])ans++;
    }
    cout<<n-ans<<endl;
}

通过的代码(2,O(n)的做法:桶计法+查分数组)

#include<iostream>
using namespace std;
const int N=1e6+6;
int cnt[N],sum[N],n,K,ans,a;
int main(){
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>n>>K;
    for(int i=1;i<=n;i++)cin>>a,cnt[a]++;
    for(int i=0;i<N;i++)if(cnt[i]){
        int l,r;
        l=max(0,i-K);r=i-1;
        sum[l]++;sum[r+1]--;
    }
    for(int i=1;i<N;i++)sum[i]+=sum[i-1];
    for(int i=0;i<N;i++)if(sum[i]==0)ans+=cnt[i];
    cout<<ans<<endl;
}

猜你喜欢

转载自blog.csdn.net/light2chasers/article/details/80646664