• 钻石收集者


    Diamond Collector钻石收集
    [命题人 : 外部导入]
    时间限制 : 10.000 sec  内存限制 : 128 MB
    
    题目描述
    贝西是一只牛,她喜欢闪闪发光的东西,于是有在空闲时间里挖钻石的爱好。她收集了N颗不同大小的钻石(N<=10
    00),她想在牛棚的展示箱里放一些钻石。因为贝西希望展示在箱子里的钻石大小尽量相似,她决定不会把两颗大
    小相差超过K的钻石一起放进箱子里(如果两颗钻石的大小恰好相差K那它们也能一起在箱子里展示)。给出K,请
    帮助贝西求出她能展示在箱子里的钻石数量的最大值。
    输入
    输入的第一行包含N和K(0<=K<=10,000)。
    接下来的N行每行包含一个整数表示其中一颗钻石的大小。所有的大小都是正数且不超过10,000
    输出
    输出一个正整数,表示贝西能展示的钻石数量的最大值
    样例输入 Copy
    5 3
    1
    6
    4
    3
    1
    样例输出 Copy
    4
    

      

    最暴力的

    #include <cstdio>
    #include <algorithm>
    #define max(x,y) x>y?x:y
    using namespace std;
    int a[1001],n,k;
    int main(){
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
    	    scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        int tot=0;
        for(int i=1;i<=n;i++) 
        //枚举最小的钻石 
    	{
                int ans=1;
                for(int j=i+1;j<=n;j++)
    			{
                    if(a[j]-a[i]>k)
    				    break;
                    ans++;
                }
                tot=max(tot,ans);
            }
        printf("%d",tot);
    }
    

      

    针对体积来考虑,因为体积<=10000

    //by myx 
    #include<bits/stdc++.h>
    using namespace std;
    int book[20001]; //这个要开到20000
    int main() {
    	int n, k;
    	cin >> n >> k;
    	memset(book,0,sizeof(book));
    	for (int i = 1; i <= n; i++) 
    	{
    		int a;
    		cin >> a;
    		book[a]++;
    		//统计体积为a的钻石有多少个 
    	}
    	int maxx = 1;
    	for (int i = 1; i <= 10001; i++) 
    	//枚举最小的钻石 
    	{
    		int b=0;
    		for(int j=i;j<=k+i;j++)
    		//统计从[i,i+k]这一段有多少个钻石 
    			b+=book[j];
    		if (b > maxx)
    			maxx = b;
    	}
    	cout << maxx << endl;
    	return 0;
    }
    

      前缀和优化下

    #include<bits/stdc++.h>
    using namespace std;
    int book[20001]; //这个要开到20000
    int sum[20000];
    int main() {
        int n, k;
        cin >> n >> k;
        memset(book,0,sizeof(book));
        for (int i = 1; i <= n; i++)
        {
            int a;
            cin >> a;
            book[a]++;
            
            //统计体积为a的钻石有多少个
        }
        for (int i=1;i<=10000;i++)
            sum[i]=sum[i-1]+book[i];
        int maxx = 1;
        for (int i = 0; i <= 10000; i++)
        if (i>=k+1)
        
            if (sum[i]-sum[i-k-1] > maxx)
                maxx = sum[i]-sum[i-k-1];
        
        cout << maxx << endl;
        return 0;
    }
    

      

      利用单调队列来做

    #include<bits/stdc++.h>
    using namespace std;
    int a[501000];
    int main()
    {
        int n,k,ans;
        cin>>n>>k;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        sort(a+1,a+n+1);
        int head=1,tail=1;
        ans=1;
        while(tail<n)
        {
            
            tail++;
            while(a[tail]-a[head]>k)
                 head++;
            if(tail-head+1>ans)
               ans=tail-head+1;
        }
        cout<<ans<<endl;
        return 0;
    }
    

      

     

      

  • 相关阅读:
    个人WPF快速入门笔记 基础样式篇02
    个人WPF快速入门笔记 基础布局篇01
    nginx常用笔记备忘
    【leetcode】1685. Sum of Absolute Differences in a Sorted Array
    【leetcode】1696. Jump Game VI
    【leetcode】1694. Reformat Phone Number
    【leetcode】1684. Count the Number of Consistent Strings
    【leetcode】1695. Maximum Erasure Value
    【leetcode】1671. Minimum Number of Removals to Make Mountain Array
    【leetcode】1689. Partitioning Into Minimum Number Of DeciBinary Numbers
  • 原文地址:https://www.cnblogs.com/cutemush/p/14671322.html
Copyright © 2020-2023  润新知