29 条题解
-
27
我又来写题解辣。 讲讲我的诗路。 此题啊题解作者我认为用循环就能解决。
题目回顾
来来来回忆分析一下题是森马意思。
题目原文: 小核桃的艾达空间可以存放m空间的物品,现有n件物品,第i件物品的价值为a[i],每件物品都占用艾达空间1个空间的体积,请问小核桃最多可以携带多少价值的物品。
解析
第一行:n,m两个数。n用来告诉你总共要输入几个数,要输出最大m个数的和。可能m会>n,这个样例2就是这种情况,这种情况你把所有数都加一遍就行啦。
第二行:有n个数要输入进数组。
来,题目解释一下: 有n个数,其中要你挑选m个数且和最大,要你输出这m个数最大的和是多少。
题目解释明白了吧,别管他这个题目是什么背景,就是这么个大意。
样例分析
我在这里选取第二个样例,第二个明白了所有的也就明白了。
样例数据
输入: 第一行:5 7 第二行:3 1 4 1 5
输出: 14
我们来分析一下,按照上面我解释的意思,答案14 = (最大的)5+(次大的)4+……+(第m-1大的)1+(第m大的)1。
明白了吗?上代码
#include <bits/stdc++.h> using namespace std; int main() { int n,m,zhenwuyu[100005]; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>zhenwuyu[i];//是个人出的题目啊他就得输入。 } sort(a+1,a+n+1);//排一下序 int sum=0; int ans=0;//sum用来统计下面的循环循环了多扫次 //num统计答案。 for(int i=n;i>=1;i--) { sum++;//循环一次咋就得加一吧,不然你判断神马玩意啊。 if(sum>m) { break;//重中之重,一定不能丢!!!如果循环地刺苏>m(要输多了),就赶紧停了,不然又瞎加的。 //判断丢了以后代码就帮你把全部数字之和都加了一遍,然后让你非常崩溃的调试。 } ans+=zhenwuyu[i]; } cout<<ans; }
-
6
P1022
-题目回顾-
小核桃的艾达空间可以存放m空间的物品,现有n件物品,第i件物品的价值为ai,每件物品都占用艾达空间1个空间的体积,请问小核桃最多可以携带多少价值的物品。
-分析-
输入
a[1]
,a[2]
~a[n]
从大到小排序,这里定义一个布尔类型函数cmp
表示排序规则,放在sort
函数里实现从大到小排序,最后编写程序即可
-代码-
#include <bits/stdc++.h> using namespace std; long n, m, sum; long aida[10005]; bool cmp(int x, int y) { return x > y; }//定义排序规则 int main()// by AGOMG { cin >> n >> m; for(int i = 1; i <= n; i++) cin >> aida[i]; sort(aida + 1, aida + n + 1, cmp); for(int i = 1; i <= m; i++) sum += aida[i]; cout << sum; return 0; }
-
4
sort函数有一个参数comp决定了sort函数的排序方式,默认为less即从小到大,通过传入greater<>()可以将其排序方式改为从大到小,这样从前往后装直到装不下即可,这种方式最简单。
#include <iostream> #include <algorithm> using namespace std; int main() { int m,n; long long int a[10005],sum=0;//这里需要使用long long int cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; sort(&a[1],&a[n+1],greater<>()); for(int i=1;i<=m&&i<=n;i++){//可能存在m>n的情况,因此加上&&i<=n的判断条件 sum+=a[i]; } cout<<sum; }
-
3
一赞拿走
#include <iostream> #include <algorithm> using namespace std; int main() { long long n, m, a[10005], sum = 0; cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; } sort(a + 1, a + n + 1); for (int i = n; i >= 1; i--) { sum += a[i]; m--; if (m == 0 || i == 1) { cout << sum; return 0; } } }
笑话时间到(3个) 1:今天去买水果,我问一个摊主:别人家的瓜都写着不甜包退,你怎么不敢写呢,瓜不好吧。摊主:不买滚,我他么卖的是苦瓜…… 2:一个路人拦下计程车,他问司机:从这儿到机场要多久?司机:要很久的。路人:起码要多久?司机:骑马要更久。 3:在游泳池戏水,突然想放屁。没憋住,身后冒起一大串泡泡。旁边小姑娘哇地一声哭了:“妈妈快跑,水开了!” 笑话结束,点个赞吧,求求了; 下一个题还有三个,期待吧。。。。。。
-
3
挑战全网行数最少(4行)
#include <bits/stdc++.h> long int n, m, a[10000], sum; bool cmp(int a, int b){return a > b;} int main(){scanf("%ld%ld", &n, &m);for (int i = 0;i < n;i++) scanf("%ld", &a[i]); std::sort(a, a + n, cmp);for (int i = 0;i < m;i++) sum += a[i]; printf("%ld", sum);}
!!!请勿一口嘎资掉!!!
-
3
using namespace std; bool cmp(long int a,long int b) { return a > b; } int main() { long long a[10005]; long int m,n; cin >> n >> m; for (long int i = 1;i <= n;i++) { cin >> a[i]; } sort (a + 1,a + n + 1,cmp); long int sum = 0; for (long int i = 1;i <= m && i <= n;i++) { sum += a[i]; } cout << sum; return 0; }
long int 或long long sum 不要忘了!!!
-
2
这是本蒟蒻第一次写题解,请大家多多关照哈😄
题目描述
小核桃的艾达空间可以存放m空间的物品,现有n件物品,第i件物品的价值为ai,每件物品都占用艾达空间1个空间的体积,请问小核桃最多可以携带多少价值的物品。
输入格式
第一行输入两个正整数 n,m,表示物品的数量和艾达空间的体积。
第二行内输入 n 个正整数,用空格间隔,第i个整数表示第i个物品的价值 ai。
输出格式
小核桃最多可以携带物品的总价值。
题目思路
这道题简单来说就是写一个cmp函数,让sort(a+1,a+n+1,cmp)把数组从大到小排序,然后每次加上剩下的物品中价值最大的就可以了
附上AC代码
#include <iostream> #include <algorithm> using namespace std; long long a[10005],n,m,value=0; bool cmp(int x, int y) { return x > y; } int main() { cin >> n >> m; for(int i=1;i<=n;i++) { cin >> a[i]; } sort(a+1,a+n+1,cmp); for(int i=1;i<=m;i++) { value+=a[i]; } cout << value; return 0; }
注意注意❗❗❗
变量一定要用LONG LONG型,不然系统会崩!!!会RE!!!
本人亲测,只得了20分!!!
最后说一句,小核桃带那么多贵重物品,不怕弄丢
被抢劫吗?!
大家
请勿欢迎一口吞掉,不然会噎死的不要管老师!
欢迎来我的个人主页玩~~~
-
2
hin简单:
思路是这样的:
首先排序,建议用cmp,防止脑袋转不过来,
然后遍历1~min(m,n)
注意!!!!!!
是
1~min(m,n)
min要加上,因为循环次数太多没意义是吧
(提示:第一次编译是C++产生目标文件的一次,如果像我这样配置不好,可能会花点时间,别以为TLE了,反正我是过了)
已AC,请放心食用
上菜:
#include <iostream> #include <algorithm> using namespace std; bool cmp(int x,int y){ return x>y; } int main(){ int m,n; long long a[10005],sum=0; cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; sort(a+1,a+n+1,cmp); for(int i=1;i<=min(m,n);i++)sum+=a[i]; cout<<sum<<endl; return 0; }
-
2
#include <iostream> #include <algorithm> using namespace std; int main() { long long n, m, a[10005], sum = 0; cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; } sort(a + 1, a + n + 1); for (int i = n; i >= 1; i--) { sum += a[i]; m--; if (m == 0 || i == 1) { cout << sum; return 0; } } }
-
2
#include <iostream> #include <algorithm> using namespace std; int main() { long long n, m, a[10005], sum = 0; cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; } sort(a + 1, a + n + 1); for (int i = n; i >= 1; i--) { sum += a[i]; m--; if (m == 0 || i == 1)//注意点, 如果空间大于物品数量,需要把所有价值相加 { cout << sum; return 0; } } }
-
2
题目描述
小核桃的艾达空间可以存放m空间的物品,现有n件物品,第i件物品的价值为��ai,每件物品都占用艾达空间1个空间的体积,请问小核桃最多可以携带多少价值的物品。
输入格式
第一行输入两个正整数 n,m,表示物品的数量和艾达空间的体积。
第二行内输入 n个正整数,用空格间隔,第i个整数表示第i个物品的价值 ai。
输出格式
小核桃最多可以携带物品的总价值。
———————————————————
就是求N个数中 M个数字的和 的最大值 1,从大到小排列, 2,选价值高的min(n,m)个东西 易错 ——人家没说N>M—— 见祖宗人们——不开LONG LONG见祖宗~—— ——看一下数据范围—— 对于 50% 的数据,1≤n,m≤10000 0≤ai≤10000
对于 100%的数据,1≤n,m≤10000,0≤ai≤1e9。 sum最多1e13
#include<bits/stdc++.h> using namespace std; int n,m,q[10000]; long long sum;//易错 bool cmp(int a,int b) { return a>b; } int main() { cin>>n>>m; for(int i=1;i<=n;i++)cin>>q[i]; sort(q+1,q+n+1,cmp); for(int i=1;i<=min(n,m);i++) { sum+=q[i]; } cout<<sum; return 0; }
-
2
#include <bits/stdc++.h> #define maxn 10001 using namespace std; int n,cnt,m; long long a[maxn],sum; bool cmp(int a,int b) { return a > b; } int main() { scanf("%d%d",&n,&m); for (int i = 1;i <= n;i ++) { scanf("%lld",&a[i]); } sort(a + 1,a + n + 1,cmp); cnt = m; for (int i = 1;i <= n;i ++) { sum += a[i]; cnt --; if(cnt == 0) { break; } } printf("%lld",sum); return 0; }
//第一眼还以为是dp😂
-
2
#include <iostream> #include <algorithm> using namespace std; long long sum; int a[100005],n,m,num=1; int main(){ cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; //禁盗 } sort(a+1,a+1+n); for(int i=n;i>=1;i--) { if(num<=m) { sum+=a[i]; num++; } } cout<<sum; return 0; }
-
2
P1022 简易背包
题目描述
小核桃的艾达空间可以存放m空间的物品,现有n件物品,第i件物品的价值为ai,每件物品都占用艾达空间1个空间的体积,请问小核桃最多可以携带多少价值的物品。
思路
肯定先装大的,就比如有一堆大小都有的蛋糕,给你一堆大于这些蛋糕的盒子,让你装回去吃,那肯定是先装大的。将n件物品排序,从大到小加到背包中。
注意:
1.50分的话那是没有用long long。
2.头文件要有<algorithm>
参考代码
#include <iostream>//hetao3097453 #include <algorithm> using namespace std; long long a[10000]; int main() { long long n,m,sum = 0; cin >> n >> m; for(long long i = 1;i <= n;i++) { cin >> a[i]; } sort(a + 1,a + n + 1); for(long long i = n;i >= 1;i--) { if(m != 0) { sum += a[i]; m--; } } cout << sum; return 0; }
hetao3097453
2023年4月21日
-
1
既然是贪心思想,从大到小累加即可
#include <bits/stdc++.h> using namespace std; int main(){ long long m, n, a[10005], sum = 0;//定义变量 cin >> n >> m; for (int i = 1; i <= n; i++){ cin >> a[i]; } sort(a+1, a+n+1);//排个序 for (int i = 1; i <= m && i <= n;/*为了防止m<n时sum加进去一些怪东西所以写两个判断*/ i++){ sum += a[n-i+1];//sort函数从小到大排序,我们要从大到小加,所以减去i,再加1 } cout << sum; return 0; }
这已经是我这个笨比能想到的最短写法了,点个赞吧,球球了👀️
信息
- ID
- 15
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 4295
- 已通过
- 1053
- 上传者