首页 > 试题广场 >

六一儿童节

[编程题]六一儿童节
  • 热度指数:36555 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力j的重量为w[j],对于每个小朋友i,当他分到的巧克力大小达到h[i] (即w[j]>=h[i]),他才会上去表演节目。老师的目标是将巧克力分发给孩子们,使得最多的小孩上台表演。可以保证每个w[i]> 0且不能将多块巧克力分给一个孩子或将一块分给多个孩子。

输入描述:
第一行:n,表示h数组元素个数
第二行:n个h数组元素
第三行:m,表示w数组元素个数
第四行:m个w数组元素


输出描述:
上台表演学生人数
示例1

输入

3 
2 2 3
2
3 1 

输出

1

贪心算法
先将两个数组都排序 然后吃的最少的小朋友先选最少的巧克力 依次往后

#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 1e6;
int w[maxn], h[maxn];

int main(){
    int n, m;
    cin>>n; for(int i=0;i<n;i++) scanf("%d", &h[i]);
    cin>>m; for(int i=0;i<m;i++) scanf("%d", &w[i]);
    sort(h, h+n); sort(w, w+m);
    int i = 0, j = 0, res = 0;
    while(j < m && i < n){
        if(h[i] <= w[j]) {res++; i++; j++;}
        else j++;
    }
    cout<<res<<endl;
}
发表于 2019-01-13 10:28:39 回复(10)
缩进很重要,浪费了很多时间:
Python版
def compare_choc(a, b, m):
    c = 0;
    t = m-1;
    for i in range(m-1, -1, -1):
        if t >= 0:
            for j in range(t, -1, -1):
                if a[i] <= b[j]:
                    c =c+ 1;
                    t = j-1;
                    break;
        else:
            break;
    print(c)

n = int(input());
h = input();
m = int(input());
w = input();
h1=sorted([int(i) for i in h.split()]);
w1= sorted([int(j) for j in w.split()]);
if n >= m:
    p = m;
else:
    p = n;
compare_choc(h1, w1, p);


发表于 2019-02-28 20:57:28 回复(2)
import java.util.Arrays;
import java.util.Scanner; public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();// n个学生
		int[] h = new int[n];// 学生
		for (int i = 0; i < h.length; i++) {
			h[i] = sc.nextInt();
		}

		int m = sc.nextInt();// m个巧克力
		int[] w = new int[m];// 巧克力
		for (int i = 0; i < w.length; i++) {
			w[i] = sc.nextInt();
		}

		Arrays.sort(w);// 巧克力排序
		Arrays.sort(h);// 学生排序

		int stuStart = 0;
		int count = 0;
		for (int i = 0; i < w.length; i++) {
			if (w[i] < h[stuStart]) {// 如果最小的巧克力比最小的学生要的小,那么跳出去下一个巧克力
				continue;
			} else {// 如果最小的巧克力比最小的学生要的大
				count++;// 那就把这个糖果给他,count加1
				stuStart++;// 给他后,把最小的学生加一个
				if (stuStart == n) {// 如果最后一个学生都有糖了,就不找了,break掉
					break;
				}
			}
		}
		System.out.println(count);
	}
}

编辑于 2017-08-21 16:12:56 回复(0)
//AC代码:
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
    int N,M,i,j;
    //freopen("input.txt","r",stdin);
    scanf("%d",&N);
    vector<int> child(N);
    for(i=0;i<N;i++) scanf("%d",&child[i]);
    scanf("%d",&M);
    vector<int> cho(M);
    for(i=0;i<M;i++) scanf("%d",&cho[i]);
    sort(child.begin(),child.end());
    sort(cho.begin(),cho.end());
    int res=0;
    for(i=0,j=0;i<M&&j<N;i++)
        if(cho[i]>=child[j])
            res++,j++;
    printf("%d\n",res);
}

发表于 2017-08-06 11:28:31 回复(3)
/*
m为巧克力个数,n为学生个数
h[i] 表示第i颗巧克力分别的大小
w[j] 表示第j个同学要求的巧克力大小,当h[i]>=w[j]时才会上台表演
对h[i],w[j]由小到大排序后比较
*/
for(i=0; i<m&&j<n; i++) { if(h[i] >= w[j]) { res++;   j++; } } System.out.println(res);

编辑于 2017-12-20 20:38:19 回复(4)

//贪心 开始用的两层for循环,太捞了,看了大家的算法用的双指针 时间复杂度就好起来了

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int candy, candynum, student, stdnum;
    vector<int> candys, students;
    cin >> stdnum;
    while (stdnum--)
    {
        int i;
        cin >> i;
        students.push_back(i);
    }
    cin >> candynum;
    while (candynum--)
    {
        int i;
        cin >> i;
        candys.push_back(i);
    }
    sort(students.begin(), students.end());
    sort(candys.begin(), candys.end());
    int cnt = 0;
    //双指针方法
    for (int i = 0, j = 0; i < candys.size()&&j < students.size(); i++)
    {
        if (candys[i] >= students[j])
             j++, cnt++;
    }
    cout << cnt << endl;
    return 0;
}
编辑于 2019-03-10 23:17:09 回复(5)

python 多行

跟 重庆第九届ACM,题鸭脖子一样
Hlen,H,Wlen,W= int(input()),list(map(int,input().split())),int(input()),list(map(int,input().split()))
H.sort(reverse=True)
W.sort(reverse=True)
i,count= 0,0
for item in H:
    if i <Wlen:
        if item<=W[i]:
            count+=1
            i+=1
print(count)

发表于 2019-04-14 00:18:35 回复(0)
def main():
    child_num = int(input())
    want_list = list(map(int,input().split()))
    chock_num = int(input())
    chock_list = list(map(int,input().split()))
    want_list.sort()
    chock_list.sort()
    i= 0
    j = 0
    count = 0
    while(i <= len(chock_list)-1 and j <= len(want_list)-1):
        if chock_list[i] >= want_list[j]:
            count += 1
            i += 1
            j += 1
        else:
            i += 1
    print(count)



if __name__ == '__main__':
    main()

发表于 2019-03-01 10:50:24 回复(0)
#include <stdio.h>
#include <stdlib.h>

int compar(const void* a, const void* b) {
  return *(int*) a - *(int*) b;
}

int main(const int argc, const char** const argv) {
  int i, j, n, m, ans = 0;
  
  fscanf(stdin, "%d", &n);
  int h[n];
  for (i = 0; i < n; ++i)
    fscanf(stdin, "%d", h + i);
  
  fscanf(stdin, "%d", &m);
  int w[m];
  for (i = 0; i < m; ++i)
    fscanf(stdin, "%d", w + i);
  
  qsort(w, m, sizeof(int), compar);
  qsort(h, n, sizeof(int), compar);
  
  i = 0, j = 0;
  while (i < m && j < n) {
    if (w[i] >= h[j]) ++ans, ++j;
    ++i;
  }
  
  return fprintf(stdout, "%d", ans), 0;
}

发表于 2021-07-19 11:33:27 回复(0)
自测用例的那个输入简直见鬼了,怎么都读不进来,牛客能不能把类似<br>这种符号解决一下,好多地方偶发这种东西,写个题解有时候发出来都有这个。
整体思路是贪心算法,将小朋友的胃口和巧克力的重量进行升序排列。然后我们优先去满足胃口小的小朋友,因为满足他们相对容易,并且最小限度满足他,以求更多地满足小朋友(即每个小朋友应该获得不小于其胃口的最轻巧克力)。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());
        String[] params = br.readLine().trim().split(" ");
        int[] h = new int[n];
        for(int i = 0; i < n; i++) h[i] = Integer.parseInt(params[i]);
        int m = Integer.parseInt(br.readLine().trim());
        params = br.readLine().trim().split(" ");
        int[] w = new int[m];
        for(int i = 0; i < m; i++) w[i] = Integer.parseInt(params[i]);
        Arrays.sort(h);
        Arrays.sort(w);
        int count = 0;
        int i = 0, j = 0;
        while(i < n && j < m){
            if(w[j] >= h[i]){
                count ++;     // 巧克力j可以满足小朋友i,跳到下一个小朋友和下一个巧克力
                i ++;
                j ++;
            }else
                j ++;         // 巧克力j满足不了小朋友i,继续检查重量更大的巧克力能否满足
        }
        System.out.println(count);
    }
}

编辑于 2021-04-19 12:59:20 回复(0)
首先给两个数组(存放每块巧克力的重量的数组和存放每一个孩子需要的巧克力的重量的数组)进行排序,然后拿出重量最少的一块巧克力按顺序跟孩子们需要的巧克力重量比较,找到符合条件的就把巧克力给他,把他的需求改成0,下次读到0就跳过,以此类推
import java.util.*;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner (System.in);
		int n=cin.nextInt();//孩子数量
		int  h[]=new int [n];//为了让第i个孩子上场需要的巧克力重量的数组
		for(int i=0;i<n;i++) {
			h[i]=cin.nextInt();//为了让第i个孩子上场需要的巧克力重量
		}
		int m=cin.nextInt();//巧克力数目
		int w[]=new int[m];//每一块巧克力的重量 的数组
		for(int i=0;i<m;i++) {
			w[i]=cin.nextInt();//每一块巧克力的重量 
		}
		Arrays.sort(h);
		Arrays.sort(w);
		int out=0;
		for(int i=0;i<m;i++) {
			for(int j=0;j<n;j++) {
				if(h[j]==0)continue;
				else if(w[i]>=h[j]) {
					
					out++;
					h[j]=0;
					break;
				}
			}
		}
		System.out.print(out);

	}

}


发表于 2019-11-04 15:54:02 回复(0)
import java.util.*;
  
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int number_student = in.nextInt();
        double[] list_student = new double[number_student];//学生数组
        for(int i=0;i<number_student;i++){
            list_student[i] = in.nextDouble();
        }
        int number_cho = in.nextInt();
        double[] list_cho = new double[number_cho];//巧克力数组
        for(int i=0;i<number_cho;i++){
            list_cho[i] = in.nextDouble();
        }
        sort(list_student);
        sort(list_cho);
        int count_student = number_student-1;
        int count_cho = number_cho-1;
        int max = 0;
        while(count_student>=0&&count_cho>=0){
            //特别注意巧克力的数量需要大于等于0(巧克力数组未遍历完)
            //否则会出现数组越界错误
            if(list_cho[count_cho]>=list_student[count_student]){
                //对于需要最多巧克力的学生给出最多的巧克力,否则跳过该学生
                max ++;
                count_student--;
                count_cho--;
            }else{
                count_student--;
            }
        }
        System.out.println(max);
    }
      
    public static void sort(double[] test){//冒泡排序
        for(int i=0;i<test.length;i++){
            for(int j=0;j<test.length-i-1;j++){
                if(test[j]>test[j+1]){
                    double temp = test[j];
                    test[j] = test[j+1];
                    test[j+1] = temp;
                }
            }
        }
    }
}
//菜狗代码,有意见指出,有问题cue我

发表于 2019-09-01 10:47:22 回复(0)
#include <iostream>
#include <queue>
using namespace std;

int main()
{
    priority_queue<int> heap_h;   // 使用优先队列保存w和h,默认是降序,堆顶为最大值
    priority_queue<int> heap_w;
    int n, m;
    cin >> n;
    int* h = new int[n];
    for (int i=0; i<n; ++i)
    {
        cin >> h[i];
        heap_h.push(h[i]);
    }
    
    cin >> m;
    int* w = new int[m];
    for (int i=0; i<m; ++i)
    {
        cin >> w[i];
        heap_w.push(w[i]);
    }
    
    int player_nums = 0;     // 用于计数
    while (!heap_h.empty() && !heap_w.empty())   
    {
        if (heap_h.top() <= heap_w.top())      // 当有糖果可分配给需求最重的小朋友
        {
            player_nums++;
            heap_h.pop();
            heap_w.pop();
        }
        else                                  // 当没有糖果可分配给需求最重的小朋友          {
            heap_h.pop();
        }
    }
    cout << player_nums;
    return 0;
}

发表于 2019-07-31 11:09:55 回复(0)
import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); 
        int childrenNumber = sc.nextInt(); //小朋友数量
        int[] needQuality = new int[childrenNumber]; //需要的巧克力的质量
        for(int i=0;i<childrenNumber;i++) {
            needQuality[i] = sc.nextInt();
        }
        Arrays.sort(needQuality);            //小朋友的需要质量排序
        int chocolatesNumber = sc.nextInt();
        int[] chocolatesQuality = new int[chocolatesNumber];
        for(int i=0;i<chocolatesNumber;i++) {
            chocolatesQuality[i] = sc.nextInt();
        }
        Arrays.sort(chocolatesQuality);        //拥有的巧克力质量排序
        sc.close();
        int result = need(needQuality, chocolatesQuality);
        System.out.println(result);
    }
    /**
     * @param needQuality 小朋友需要的质量
     * @param chocolatesQuality 巧克力的质量
     * @return 最多能上台的小朋友数量
     * 贪心算法
     */
    public static int need(int[] needQuality , int[] chocolatesQuality) {
        int pointer1 = 0 ; //遍历chocolatesQuality指针
        int pointer2 = 0 ; //遍历needQuality指针
        int count = 0 ;       //计数
        while(pointer1<chocolatesQuality.length&&pointer2<needQuality.length) {
            if(chocolatesQuality[pointer1]<needQuality[pointer2]) {
                pointer1++;
            }else{
                count++;
                pointer2++;
                pointer1++;
            }
        }
        return count;
    }
}

发表于 2019-06-25 13:56:40 回复(0)
老夫真是服了你这个输入格式****,
顺便跪求大佬,3 <br> 2 2 3<br> 2<br> 3 1 告知下python怎么处理这个输入格式
发表于 2019-06-07 01:03:35 回复(0)
思路:题目说的是巧克力能分给几个孩子,而且巧克力不能拆分,巧克力的重量必须大于
孩子的需求,所以先对孩子的需求数组h和巧克力重量数组w进行从小到大的排序
目的是先取最大的巧克力与孩子的最大需求比较,
若大于等于则人数加1,两个数组w,h都往前移一位,
若小于,则证明最大的巧克力满足不了最大的需求,所以需求数组h往前移一位,
需考虑循环终止的条件

#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
 
int main()
{
    int n;//孩子的数量
    cin>>n;
    vector<int> h; //需求数组
    int mid;
    for(int i=0;i<n;i++)
    {
        cin>>mid;
        h.push_back(mid);
    }
    int m;//巧克力个数
    cin>>m;
    vector<int> w; //巧克力重量数组
    for(int i=0;i<m;i++)
    {
        cin>>mid;
        w.push_back(mid);
    }
    sort(h.begin(),h.end());
    sort(w.begin(),w.end());//排序
 
    int j=n-1;
    int k=m-1;
    int total=0;
    while(k>=0&&j>=0)//数组边界
    {
        if(w[k]>=h[j]) //若大于则人数加1 ,数组往前移
        {
            total++;
            j--;
            k--;
        }
        else          //若小于则巧克力数组不动
              {            //需求数组在满足边界条件的情况下往前移动
            if(j>0)
            {
                j--;
            }
        }
        if(j==0&&w[k]<h[j]) //可能出现需求数组已经到达边界
        {                   //巧克力仍无法满足的情况,此时跳出循环
            break;
        }
    }
    cout<<total<<endl;
    return 0;
}

编辑于 2019-05-29 19:40:10 回复(0)
路过的大佬能不能帮我看下? case通过率为90.00%,调试了好久,找不到原因,有没有大佬帮我看下问题出在哪里,先谢谢啦!!!
var n = readline();
var h = readline().split('');
var m = readline();
var w = readline().split('');
var res=0;

function num(a,b){
    return b-a;
}
h.sort(num);
w.sort(num);

while(m>0&&n>0){
    if(w[m-1]<h[n-1]){
        m--;
    }else{
        res++;
        m--;
        n--;
    }
}

print(res);

发表于 2019-05-20 22:14:09 回复(2)
#先排序,再用双指针,j代表巧克力的索引,而i代表孩子的索引
import sys
n=int(sys.stdin.readline().strip())
h=list(map(int, sys.stdin.readline().strip().split()))
m=int(sys.stdin.readline().strip())
w=list(map(int, sys.stdin.readline().strip().split()))
h.sort()
w.sort()
res = 0
i=0
for j in range(m):
    if i < n and w[j] >= h[i]:
        res += 1
        i += 1   #当前孩子上台表演,i要+1寻找下一个
print(res)   

编辑于 2019-03-18 21:26:59 回复(2)
贪心算法

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] h = new int[n];
        for (int i = 0; i < n; i++) {
            h[i] = sc.nextInt();
        }
        int m = sc.nextInt();
        int[] w = new int[m];
        for (int i = 0; i < m; i++) {
            w[i] = sc.nextInt();
        }
        Arrays.sort(h);
        Arrays.sort(w);
        int pos = n - 1;
        int res = 0;
        for (int j = m - 1; j >= 0; j--) {
            for (int i = pos; i >= 0; i--) {
                if (w[j] >= h[i]) {
                    res++;
                    pos = i - 1;
                    break;
                }
            }
        }
        System.out.println(res);
    }
}

运行时间:43ms

占用内存:10664k


发表于 2019-03-13 00:53:30 回复(1)
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> h(n); for(int k = 0; k < n; k++){
    cin >> h[k]; }
    int m;
    cin >> m;
    vector<int> w(m);
    for(int k = 0; k < n; k++){
        cin >> w[k];
    }
    sort(h.begin(), h.end());
    sort(w.begin(), w.end());
    int performNum = 0;
//对于每一个小朋友i
    for(int i = 0, j = 0; i < n && j < m; ){
        if(w[j] >= h[i]){
             performNum++;
             i++;
             j++;
        }
         else{
             j++;
         }
     }
     cout << performNum << endl;
     return 0;
}

编辑于 2019-02-23 15:49:41 回复(0)