22 条题解
-
24
还是解题三步走
一、输入
不用我多说了吧……
int n, m, a[10001], b[10001], No = 1, num = 0; cin >> n >> m; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1; i <= m; i ++) cin >> b[i];
二、分析
1.观察题目:
这是一道经典的贪心思想题目(读者:为什么呢? 作者:因为在贪心的课后作业里……)。
2.贪心策略:
把胃口值和饼干大小依次比较,如果饼干大小<胃口值,就把下一个饼干大小与胃口值比较。
3.代码:
sort(a + 1, a + n + 1); //排序 sort(b + 1, b + m + 1); for (int i = 1; i <= n; i ++) { if (a[i] >= b[No]) //No是胃口值的序号(参见输入部分) { No ++; num ++; } if (num == m) //* break; }
*:这个部分非常重要,没了它,就会80 WA。(读者:为什么? 作者:因为人数5人,输出了6人……)
三、输出
又是老生常谈……
cout << num;
四、完整代码
呃呃呃,先别打,代码在路上了
#include <bits/stdc++.h> using namespace std; int main() { int n, m, a[10001], b[10001], No = 1, num = 0; cin >> n >> m; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1; i <= m; i ++) cin >> b[i]; sort(a + 1, a + n + 1); sort(b + 1, b + m + 1); for (int i = 1; i <= n; i ++) { if (a[i] >= b[No]) { No ++; num ++; } if (num == m) break; } cout << num; return 0; }
-
18
#include <bits/stdc++.h>//或者使用标准输入输出库和算法库 using namespace std; int main() { int n,m,a[10005],b[10005]; cin >> n >> m; for (int i = 1;i <= n;i++) { cin >> a[i]; } for (int i = 1;i <= m;i++) { cin >> b[i]; } sort (a + 1,a + n + 1); sort(b + 1,b + m + 1); int num = 0; for (int i = 1;i <= m;i++)//胃口 { int p = 0; for (int j = 1;j <= n;j++)//饼干 { if (a[j] >= b[i])//能吃下去的最小大小饼干 { a[j] = -1;//吃掉了 num++;//能吃上饼干的人多了一个 p = 1; break;//去查看下一个人 } } if (p == 0) { break; } } cout << num;//输出 return 0; }/*p的作用是优化代码, 如果这个胃口小的已经无法满足, 那么下一个胃口更大的也无法满足,直接 可以跳出循环,结束代码, 可以节省0.1秒的时间, 去掉也没有问题, 用时也才区区0.3秒, 优化后是0.2秒 均可AC。简单易懂, 别忘了顺手点个赞!!!!! 要累死了【不容易】【不容易】 唉唉唉 */
-
7
P1024【挑战题】吃饼干
题目描述
核晶学院后勤部准备了n片饼干,打算分发给m位学生,第i片饼干大小为a[i],第i位同学胃口值为b[i],每位同学只想吃下比自己胃口值大的饼干,请问这n片饼干,最多能让几位同学满足。
思路
可以先将a,b两个数组输入进去,再排序一下,最后逐位比较。
输入:
int n,m; cin >> n >> m; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= m;i++) { cin >> b[i]; }
排序:
sort(a + 1,a + n + 1); sort(b + 1,b + m + 1);
(需要有<algorithm>)
逐位比较:
for(int i = 1;i <= n && j <= m;i++) { if(a[i] >= b[j]) { j++; sum++; } } cout << sum;
参考代码:
#include <iostream>//hetao3097453 #include <algorithm> using namespace std; int a[10001],b[10001],sum; int main() { int n,m; cin >> n >> m; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= m;i++) { cin >> b[i]; } sort(a + 1,a + n + 1); sort(b + 1,b + m + 1); int j = 1; for(int i = 1;i <= n && j <= m;i++) { if(a[i] >= b[j]) { j++; sum++; } } cout << sum; return 0; }
hetao3097453
2023年4月22日
-
3
#P1024. 【挑战题】吃饼干
题目描述
核晶学院后勤部准备了n片饼干,打算分发给m位学生,第i片饼干大小为a[i],第i位同学胃口值为b[i],每位同学只想吃下大于等于自己胃口值的饼干,请问这n片饼干,最多能让几位同学满足。
输入格式
第一行输入两个正整数 n,m,表示饼干的数量和学生的数量。
第二行内输入 nn 个正整数,用空格间隔,第i个整数表示第i片饼干的大小 ai。*
第三行内输入 mm 个正整数,用空格间隔,第i个整数表示第i位同学的胃口大小bi。
输出格式
学生可以吃上饼干的最多数量。
#include <iostream>
#include <algorithm>
using namespace std;
正常23部曲int n,m,a[10005],b[10005],num1,num2;
//不常规操作int main() { cin >> n >> m; for (int i = 1;i <= n;i++) cin >> a[i]; for (int i = 1;i <= m;i++) cin >> b[i];//输入 sort(a + 1,a + n + 1); sort(b + 1,b + m + 1);//排序 while (num2 < m && num1 < n) { if (a[num1 + 1] < b[num2 + 1]) { num1++; continue; } num1++; num2++; } cout << num2; return 0; }
已AC,请勿抄袭 😄 😄 😄
-
3
题目大意
存在n个饼干,m个学生,只有饼干的大小大于学生的胃口,学生才愿意吃这个饼干,问最多有几个学生能吃上饼干。
提示
胃口最小的学生和最小的饼干匹配,如果最小的饼干满足不了胃口最小的学生,那就.....
完整思路
将饼干和学生都从小到大排序后,枚举每个饼干,如果当前的饼干可以满足当前学生的胃口,这位学生就能吃上饼干,累加,并转到下个学生,如果满足不了,就换下一块饼干继续判断。
核心代码
int j = 1; for (int i = 1; i <= n && j <= m; i++) { if (a[i] >= b[j]) { j++; sum++; } }
-
2
#include <bits/stdc++.h>//msh using namespace std; int main() { int n, m, a[10001], b[10001], No = 1, num = 0; cin >> n >> m; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1; i <= m; i ++) cin >> b[i]; sort(a + 1, a + n + 1); sort(b + 1, b + m + 1); for (int i = 1; i <= n; i ++) { if (a[i] >= b[No]) { No ++; num ++; } if (num == m) break; } cout << num; return 0; }//先赞再看养成好习惯
-
1
双指针不回溯,O(n)解决
#include<bits/stdc++.h> using namespace std; int a[10010],b[10010]; int n,m,ans=0; int main(){ cin>>m>>n; for(int i=1;i<=m;i++){ cin>>b[i]; } for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+n+1); sort(b+1,b+m+1); int j=1; for(int i=1;i<=n;i++){ while(b[j]<a[i] && j<=m){ j++; } if(j<=m){ ans++; j++; } } cout<<ans; return 0; }
-
1
#include<bits/stdc++.h>//from hetao738467(禁止抄袭) using namespace std; int n,m,p=1,sum; int s[10005],b[10005];//不是我爱骂人,学生的英文首字母是S,饼干的是B。。。 int main() { cin>>n>>m; for(int i=1;i<=n;i++)cin>>b[i]; sort(b+1,b+1+n);//饼干从小到大排序 for(int i=1;i<=m;i++)cin>>s[i]; sort(s+1,s+1+m);//学生胃口值从小到大排序 for(int i=1;i<=m;i++)//尝试满足每一位学生(优先满足胃口值小的) { for(;p<=n;p++) { if(s[i]<=b[p])//满足条件 { sum++; p++; break;//第i名同学满足了 } } if(p>n)break;//饼干用光了 } cout<<sum;//输出 return 0; }
-
1
#include <bits/stdc++.h>//dark王 using namespace std; int n,m,ans,a[10001],b[10001]; int main(){ cin >> n >> m; for (int i = 1;i <= n;i++) cin >> a[i]; for (int i = 1;i <= m;i++) cin >> b[i]; //输入部分 sort(a+1,a+n+1);//此步骤为了方便循环计算 for (int i = 1;i <= m;i++){ //遍历每位同学 for (int j = 1;j <= n;j++){ //遍历每块饼干 if (a[j] >= b[i]){ //条件 ans++; //答案+1 a[j] = -1; //就是说这块饼干没有了 break; //避免重复 } } } cout << ans; //输出答案 return 0; // dark王 特制,搬运狗趋势; }
这题其实不难,就是将大于胃口值的最小值找出,一般用max比较,但在sort函数后,可以直接从小到大去找,然后就是细节;然后就是祝各位天天开心,天天愉快。Ok,goodbye,my home people!
-
-2
#include <bits/stdc++.h> using namespace std; int main() { int n, m, a[10001], b[10001], No = 1, num = 0; cin >> n >> m; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1; i <= m; i ++) cin >> b[i]; sort(a + 1, a + n + 1); sort(b + 1, b + m + 1); for (int i = 1; i <= n; i ++) { if (a[i] >= b[No]) { No ++; num ++; } if (num == m) break; } cout << num; return 0; }
-
-2
#include <iostream> #include <algorithm> using namespace std; int main(){ ios::sync_with_stdio(false);//没必要,纯粹裝B cin.tie(0);cout.tie(0);//没必要,纯粹裝B int n,m,a[10001],b[10001],cnt=1,ans=0; cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=m;i++)cin>>b[i]; sort(a+1,a+n+1); sort(b+1,b+m+1); for(int i=1;i<=n;i++){ if(a[i]>=b[cnt])cnt++,ans++;//一一比较,直到满足这个人 if(ans==m)break; } cout<<ans<<endl; return 0; }
-
-2
#include <iostream> #include <algorithm> using namespace std; int a[10001],b[10001],sum; int main() { int n,m; cin >> n >> m; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= m;i++) { cin >> b[i]; } sort(a + 1,a + n + 1); sort(b + 1,b + m + 1); int j = 1; for(int i = 1;i <= n && j <= m;i++) { if(a[i] >= b[j]) { j++; sum++; } } cout << sum; return 0; } //hetao1400874
-
-2
yasuo👀️
#include <iostream> #include <algorithm> int main(){ int n,m,a[10005],b[10005],ans=0; std::cin>>n>>m; for(int i=0;i<n;i++)std::cin>>a[i]; for(int i=0;i<m;i++)std::cin>>b[i]; std::sort(a,a+n); std::sort(b,b+m); int* pos=b; for(int i=0;i<n&&ans<m;i++)if(a[i]>=*pos){ans++; pos++;} std::cout<<ans; return 0;}
-
-2
#include <bits/stdc++.h> using namespace std; int main() { int n, m, a[10001], b[10001], No = 1, num = 0; cin >> n >> m; for (int i = 1; i <= n; i ++) cin >> a[i]; for (int i = 1; i <= m; i ++) cin >> b[i]; sort(a + 1, a + n + 1); sort(b + 1, b + m + 1); for (int i = 1; i <= n; i ++) { if (a[i] >= b[No]) { No ++; num ++; } if (num == m) break; } cout << num; return 0; }
-
-3
#include <iostream>//by Chris knowledge #include <algorithm> using namespace std; int a[10001],b[10001],sum; int main() { int n,m; cin >> n >> m; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= m;i++) { cin >> b[i]; } sort(a + 1,a + n + 1); sort(b + 1,b + m + 1); int j = 1; for(int i = 1;i <= n && j <= m;i++) { if(a[i] >= b[j]) { j++; sum++; } } cout << sum; return 0; }
-
-3
#include <bits/stdc++.h> #define maxn 10001 using namespace std; int n,m,ans,sta = 1,flag; int a[maxn],b[maxn]; int main() { scanf("%d%d",&n,&m); for(int i = 1;i <= n;i ++) { scanf("%d",&a[i]); } for (int i = 1;i <= m;i ++) { scanf("%d",&b[i]); } sort(a + 1,a + n + 1); sort(b + 1,b + m + 1); for (int i = 1;i <= n;i ++) { if (a[i] >= b[1]) { flag = i; break; } } for (int i = flag;i <= n;i ++) { for (int j = sta;j <= m;j ++) { if (a[i] < b[j]) { continue; } else { ans ++; sta = j + 1; break; } } } printf("%d",ans); return 0; }
//不优化是不是也能过啊
-
-3
#include <iostream>//hetao3097453 #include <algorithm> using namespace std; int a[10001],b[10001],sum; int main() { int n,m; cin >> n >> m; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= m;i++) { cin >> b[i]; } sort(a + 1,a + n + 1); sort(b + 1,b + m + 1); int j = 1; for(int i = 1;i <= n && j <= m;i++) { if(a[i] >= b[j]) { j++; sum++; } } cout << sum; return 0; }
-
-4
#include <iostream>//hetao3097453 #include <algorithm> using namespace std; int a[10001],b[10001],sum; int main() { int n,m; cin >> n >> m; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= m;i++) { cin >> b[i]; } sort(a + 1,a + n + 1); sort(b + 1,b + m + 1); int j = 1; for(int i = 1;i <= n && j <= m;i++) { if(a[i] >= b[j]) { j++; sum++; } } cout << sum; return 0; }
-
-4
#include <iostream>//hetao3097453 #include <algorithm> using namespace std; int a[10001],b[10001],sum; int main() { int n,m; cin >> n >> m; for(int i = 1;i <= n;i++) { cin >> a[i]; } for(int i = 1;i <= m;i++) { cin >> b[i]; } sort(a + 1,a + n + 1); sort(b + 1,b + m + 1); int j = 1; for(int i = 1;i <= n && j <= m;i++) { if(a[i] >= b[j]) { j++; sum++; } } cout << sum; return 0; }
信息
- ID
- 17
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 2687
- 已通过
- 928
- 上传者