zoukankan      html  css  js  c++  java
  • 钻石收集者

    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;
    }
    

      

     

      

  • 相关阅读:
    前端开发资料、实用小工具
    冒泡排序法,二分查找法
    数组练习
    一维数组练习题
    for循环输出菱形
    练习题
    课堂练习
    gO语言的安装和环境变量的配置
    PO BO VO DTO POJO DAO 概念及其作用
    BaseServlet
  • 原文地址:https://www.cnblogs.com/cutemush/p/14671322.html
Copyright © 2011-2022 走看看