第一行:n,表示h数组元素个数
第二行:n个h数组元素
第三行:m,表示w数组元素个数
第四行:m个w数组元素
上台表演学生人数
3 <br> 2 2 3<br> 2<br> 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;
}
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);
}
}
//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);
} //贪心 开始用的两层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;
}
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()
#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;
} 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);
}
} 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);
}
}
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我 #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;
}
思路:题目说的是巧克力能分给几个孩子,而且巧克力不能拆分,巧克力的重量必须大于
孩子的需求,所以先对孩子的需求数组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;
}
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);
#先排序,再用双指针,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)
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
#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;
}