• Codeforces 990B :Micro-World


    B. Micro-World
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You have a Petri dish with bacteria and you are preparing to dive into the harsh micro-world. But, unfortunately, you don't have any microscope nearby, so you can't watch them.

    You know that you have nn bacteria in the Petri dish and size of the ii-th bacteria is aiai. Also you know intergalactic positive integer constant KK.

    The ii-th bacteria can swallow the jj-th bacteria if and only if ai>ajai>aj and aiaj+Kai≤aj+K. The jj-th bacteria disappear, but the ii-th bacteria doesn't change its size. The bacteria can perform multiple swallows. On each swallow operation any bacteria ii can swallow any bacteria jjif ai>ajai>aj and aiaj+Kai≤aj+K. The swallow operations go one after another.

    For example, the sequence of bacteria sizes a=[101,53,42,102,101,55,54]a=[101,53,42,102,101,55,54] and K=1K=1. The one of possible sequences of swallows is: [101,53,42,102,101––,55,54][101,53,42,102,101_,55,54]  [101,53,42,102,55,54][101,53_,42,102,55,54]  [101––,42,102,55,54][101_,42,102,55,54]  [42,102,55,54][42,102,55,54_]  [42,102,55][42,102,55]. In total there are 33 bacteria remained in the Petri dish.

    Since you don't have a microscope, you can only guess, what the minimal possible number of bacteria can remain in your Petri dish when you finally will find any microscope.

    Input

    The first line contains two space separated positive integers nn and KK (1n21051≤n≤2⋅1051K1061≤K≤106) — number of bacteria and intergalactic constant KK.

    The second line contains nn space separated integers a1,a2,,ana1,a2,…,an (1ai1061≤ai≤106) — sizes of bacteria you have.

    Output

    Print the only integer — minimal possible number of bacteria can remain.

    Examples
    input
    Copy
    7 1
    101 53 42 102 101 55 54
    
    output
    Copy
    3
    
    input
    Copy
    6 5
    20 15 10 15 20 25
    
    output
    Copy
    1
    
    input
    Copy
    7 1000000
    1 1 1 1 1 1 1
    
    output
    Copy
    7
    
    Note

    The first example is clarified in the problem statement.

    In the second example an optimal possible sequence of swallows is: [20,15,10,15,20,25][20,15,10,15,20_,25]  [20,15,10,15,25][20,15,10,15_,25]  [20,15,10,25][20,15,10_,25] [20,15,25][20,15_,25]  [20,25][20_,25]  [25][25].

    In the third example no bacteria can swallow any other bacteria.

    题意:有n个细菌,每个细菌的尺寸为ai,现在有以常数k,如果细菌i的尺寸ai大于细菌j的尺寸aj,并且ai<=aj+k,那么细菌i就可以吃掉细菌j,问最后可以剩于多少个细菌。

    我的思路:对数组a进行降序排序,并记录下来次大值出现的位置,将最大值出现的个数记为j,j-1得到无法进行吞噬的细胞数,即最后剩下的细胞中一定会包括所有的尺寸最大的细胞。将排好序的细胞从n位置开始去重。

    如果所有的细胞尺寸相同,最终结果等于n。如果尺寸不全相同,遍历去重后的数组,查找有多少相邻元素不符合要求,更新ans的值

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    int a[maxn];
    int b[maxn];
    bool cmp(int x,int y)
    {
    	return x>y;
    }
    int main(int argc, char const *argv[])
    {
    	int n,k;
    	scanf("%d%d",&n,&k);
    	for(int i=0;i<n;i++)
    		scanf("%d",&a[i]);
    	sort(a,a+n,cmp);
    	int x=0;
    	int ans=0;
    	memset(b,0,sizeof(b));
    	b[x]=a[0];
    	int flag=1;
    	int j;
    	for(j=1;;j++)
    	{
    		if(a[0]==a[j])
    			ans++;
    		else
    			break;
    	}//查找次大值出现的位置和最大值出现的次数
    	for(int i=j;i<n;i++)
    	{
    		if(a[i]==b[x])
    			flag+=1;
    		if(a[i]==b[x]&&abs(a[i]-b[x-1])>k)
    		{
    			ans++;
    		}
    		else
    			b[++x]=a[i];
    	}//对数组进行去重
    	if(flag==n)
    		ans=n;//如果所有元素相同,ans=n
    	else
    	{//否则,遍历数组
    		for(int i=0;i<x;i++)
    		{
    			if(b[i]-b[i+1]>k)
    				ans++;
    		}	
    		ans++;
    	}
    	cout<<ans<<endl;
    	return 0;
    }

    另一种做法(百度上找的,比我写的简单了好多):用一个数组记录相同尺寸细菌的个数,然后进行去重排序,从次小的细胞开始比较相邻的细胞是否符合要求,如果符合要求,减去较大尺寸细胞的个数

    原帖地址:点击打开链接

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    int a[maxn];
    int b[maxn];
    int main()  
    {  
        int n,k;  
        scanf("%d%d",&n,&k);
        memset(b,0,sizeof(b));
        for(int i=0;i<n;i++)
        {  
            scanf("%d",&a[i]); 
            b[a[i]]++;
        }  
        sort(a,a+n);  
        int len=unique(a,a+n)-a;  
        int ans=n;  
        for(int i=1;i<len;i++)  
            if(a[i]>a[i-1]&&a[i]<=a[i-1]+k)  
                ans-=b[a[i-1]];  
        cout<<ans<<endl;  
        return 0;  
    }  
  • 相关阅读:
    python 面向对象之路(1) 类和对象 三大特性 封装 继承 多态
    python 模块之路 异常处理基础 异常处理其他 报错处理
    python 模块之路 序列化 json pickle
    python 模块之路 random模块 时间模块 sys模块 os模块
    python 模块之路 re模块运用
    python -模块之路 正则表达式
    【Unity】粒子特效优化实践
    快速实现Low Poly地形
    【Unity】屏幕空间位置变换到世界空间位置的方法
    Substance Designer 使用手册
  • 原文地址:https://www.cnblogs.com/Friends-A/p/9308995.html
Copyright © 2020-2023  润新知