第一行:n,表示h数组元素个数
第二行:n个h数组元素
第三行:m,表示w数组元素个数
第四行:m个w数组元素
上台表演学生人数
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;
}
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);
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; }