首页 > 编程语言 >蓝桥杯 ALGO-34算法训练 纪念品分组

蓝桥杯 ALGO-34算法训练 纪念品分组

时间:2022-12-02 17:00:27浏览次数:49  
标签:count 纪念品 int 34 蓝桥 ++ 分组 ALGO include

时间限制:1.0s 内存限制:256.0MB
关键字:贪心 排序
问题描述
  元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时 间内发完所有纪念品,乐乐希望分组的数目最少。
  你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入格式
  输入包含n+2行:
  第1行包括一个整数w,为每组纪念品价格之和的上限。
  第2行为一个整数n,表示购来的纪念品的总件数。
  第3~n+2行每行包含一个正整数pi (5 <= pi <= w),表示所对应纪念品的价格。
输出格式
  输出仅一行,包含一个整数,即最少的分组数目。
样例输入
100
9
90
20
20
30
50
60
70
80
90
样例输出
6
数据规模和约定
  50%的数据满足:1 <= n <= 15
  100%的数据满足:1 <= n <= 30000, 80 <= w <= 200
【分析】
由于题目要求每组纪念品价格之和的上限,并且每组最多只能包括两件纪念品,由此可以知道如果某件纪念品价格大于价格上限减去最小值,则需要独立一组,等于上限与最小值的差值的价格可以和最小值分在同一组,剩余的任意组合成两组即可满足条件。
【参考代码】
C++:

#include "iostream"
#include "string"
#include "stdio.h"
#include "ctype.h"
#include "algorithm"
#include "stack"
#include "list"
#include "math.h"
using namespace std;
const  int N =30001;
int a[N];
int main()
{
    int n;
    int w;
    cin>>w>>n;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    std::sort(a,a+n);
    int ans=0;
    for(int i=0,j=n-1;i<=j;)
    {
        for(;i<j;j--)
        {
            if(a[i]+a[j]<=w)
                break;
            else ans++;
        }
        if(i!=j)
        {
            i++;j--;
            ans++;
        }
        else
        {
            ans++;
         break;
        }



    }
    cout<<ans;
    return 0;
}

C:

#include <stdio.h>
void qsort(int i,int j);
int a[30000];
void qsort(int i,int j){     
int x,p,q;    
 x=a[i]; p=i; q=j;    
  while (i<j)     {           
  while ((i<j)&&(a[j]>x))
   j--;         
    if (i<j)          
     {             
      a[i]=a[j];             
       i++;          
        }           
        while ((i<j)&&(a[i]<x))
         i++;           
         if (i<j)           
         {              
         a[j]=a[i];              
         j--;          
          }     
          }     
          a[i]=x;     
          if (p<i-1) 
          qsort(p,i-1);     
          if (i+1<q) 
          qsort(i+1,q);}
          main(){      
          int n,w,s,i,j;     
           scanf("%d%d",&w,&n);     
            for (i=0;i<n;i++) 
            scanf("%d",&a[i]);      
            qsort(0,n-1);      
            i=0;
             j=n-1; 
             s=0;     
             while (i<j)     
              {           
               s++;           
                if (a[i]+a[j]<=w)           
                 {              
                  i++;              
                   j--;           
                    }            
                    else j--;     
                     }      
                     if ((i==j)&&(a[i]<=w)) 
                     s++;       
                     printf("%d",s);     
                      getchar();      
                      getchar();     
                       return(0);
                       }

Java:

import java.io.*;
import java.util.Arrays;
public class Main {
    static int a[]=new int[30001];
    public static void main (String args[])throws IOException{
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        int w=Integer.parseInt(bf.readLine());
        int n=Integer.parseInt(bf.readLine());
        for(int i=1;i<30001;i++)
            a[i]=999999;
        int k=n;
        int sum=0;
        for(int i=1;i<=n;i++)
        a[i]=Integer.parseInt(bf.readLine());
        Arrays.sort(a);
        oter:for(int i=1;i<=n;i++){
            for(int j=n;j>0;j--){
                if(k==i){
                    sum++;
                    break oter;
                }
                if(k-i==1&&a[i]+a[k]>w){
                    sum+=2;
                    break oter;
                }
                if(k-i==1&&a[i]+a[k]<=w){
                    sum++;
                    break oter;
                }
                if(a[i]+a[k]>w){
                    k--;
                    sum++;
                    }
                else{
                    sum++;
                    k--;
                    break;
                }
            }
        }
        System.out.println(sum);

    }
}

上面的Java代码是参考资料里的,下面是我自己的写的,感觉思路比较简单吧,能运行出来结果

import java.util.Scanner;
import java.util.Arrays;


import java.util.ArrayList;
public class 纪念品分组 
{
    public static void main(String[] args) 
    {
        Scanner sc = new Scanner (System.in);
        int max = sc.nextInt(); //纪念品和的上限
        int n = sc.nextInt();   //纪念品组数
        int[] arr = new int[n];
        for (int i=0; i<n; i++)     //遍历存储纪念品的价格
        {
            arr[i] = sc.nextInt();
        }
        Arrays.sort(arr);   //纪念品价格排序
        int min = arr[0];   //价格最小值
        int temp = max - min;       //中间变量:价格上限和最小值的差值
        int count = 0;
        int count1 = 0;
        int count2 = 0;
        for (int i=0; i<n; i++)
        {
            if (arr[i] > temp)
            {
                count++;        //单独一组的数量
            }
            if (arr[i] == min)
            {
                count1++;       //最小值的数量
            }
            if (arr[i] == temp)
            {
                count2++;       //能与最小值凑成一组刚好等于价格上限的数量
            }
        }
        int a = Math.min(count1, count2);       //价格之和等于价格上限的组数

        if ((n - count - 2*a)%2 == 0)       //判断剩余的是否能刚好分成两件一组
        {
            count = count + a + (n - count - 2*a)/2;
        }
        else
            count = count + a + (n - count - 2*a)/2 + 1;

        System.out.println(count);
    }
}

标签:count,纪念品,int,34,蓝桥,++,分组,ALGO,include
From: https://blog.51cto.com/linmengmeng/5907239

相关文章

  • algorithm of linking clip-level action detections
    2017TCNN- TubeConvolutionalNeuralNetwork(T-CNN)forActionDetectioninVideos-ICCV 这篇论文的clip-levellinking算法其实是从2015年findactiontubes论......
  • 代码随想录Day34
    LeetCode501.二叉搜索树的众数给定一个有相同值的二叉搜索树(BST),找出BST中的所有众数(出现频率最高的元素)。假定BST有如下定义:结点左子树中所含结点的值小于等于当......
  • google浏览器被2345地址更改
    在Windows启动后,点击“开始”→“运行”或者快捷菜单“window+R”,在“打开(0)”栏中键入regedit,然后按“确定”键,如下图:依次展开注册表到“HKEY_CURRENT_USER\SOFTWARE\M......
  • [15-445]Join Algorithms memo (Join 为什么要用小表做驱动表)
    NestedLoopJoin这一章节主要讲解join的算法,我想记录一些重点的地方。有趣的是关于NestedLoopjoin对驱动表为什么小表会更好这个问题,搜遍简中的blog都是一些错......
  • 1002 A+B for Polynomials (附测试点3456的坑)
    题目:1002A+BforPolynomialsThistime,youaresupposedtofind A+B where A and B aretwopolynomials.InputSpecification:Eachinputfilecontainsone......
  • 1234567
    后台代码:1.easyopen字样全部改成dataServer,其余功能不变前台代码:1.服务端,管理端登录页面改造2.管理端管理页面改造2022103120.50demo03后台代码改造成功,待测......
  • 1234
    后台代码:1.easyopen字样全部改成dataServer,其余功能不变前台代码:1.服务端,管理端登录页面改造2.管理端管理页面改造2022103120.50demo03后台代码改造成功,待测......
  • P3834 【模板】可持久化线段树 2
    【模板】可持久化线段树2题目背景这是个非常经典的可持久化权值线段树入门题——静态区间第\(k\)小。数据已经过加强,请使用可持久化权值线段树。同时请注意常数优化......
  • 题解 SP346
    题解SP346这个题的翻译貌似有点问题,这里的coins和goldcoins其实是一个东西有了这个前提,我们是再去看题面,就可以发现,这里的coins可以同时换成$\dfrac{n}{2}\\df......
  • Python: Guess and Check algorithms, Approximate solutions, Bisection method
     判断一个整数是否为完全立方数cubicnumber:  importmathcubical=int(input('number:'))defis_cubical(cubical:int):n=math.ceil(pow(cubic......