题解
糖果
4 条题解
-
0
#include<bits/stdc++.h> using namespace std; /* 1、赠送的糖果只能低于你前面购买的两个糖果的价格 比如你买的是4元、5元的糖果,只能送你4元以下的,我们肯定希望拿贵的。 举例:糖果价格从低到高排列 1 2 3 4 5 6 买5、6 送 4 买 3、2 送1 我们将数组排序,排序之后从最右边开始往左扫描,买两个送一个 排序需要用到sort函数,需要学习 */ int main(){ //数组长度是多少呢?n最大值是1000 long long n, a[1005], s = 0; //n糖果数量, a糖果价格数组, s总花费 cin >> n; //输入糖果价格 for (int i = 1; i <= n; i++) { cin >> a[i]; } //将糖果价格从小到大排序 sort(a + 1, a + n + 1);//下标如果从0开始sort(a, a + n); //逗号左边是数组名称+1,表示从下标1开始,逗号右边是 数组名称+数组长度+1 //这两种情况直接背下来 //排序结束后,我们从价格最高的糖开始,每三个为一组进行处理 //策略是只支付每组中价格最高的两个糖果,便宜的那个不算价格,是送的 for (int i = n; i > 0; i -= 3) { s += a[i] + a[i - 1];//支付这一组价格最高的两个糖果 } cout << s;//输出总花费 return 0; } -
0
#include<bits/stdc++.h> using namespace std; long long a[300005]; int main(){ int n; long long s=0,minn=LONG_LONG_MAX; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; s+=a[i]; } sort(a+1,a+n+1); for(int i=1;i<=n;i++){ minn=min(minn,s-a[i]*(n-i+1)); //a[i]*(n-i+1)被留下的部分 } cout<<minn; return 0; } -
0
#include <bits/stdc++.h> using namespace std; int main(){ int n, a[1003], s = 0; // n:糖果数量, a:糖果价格数组, s:总花费 cin >> n; // 读取所有糖果的价格 for(int i = 1; i <= n; i++){ cin >> a[i]; } // 将糖果价格从小到大排序 // 注意:这里从下标1开始排序,到下标n结束 sort(a + 1, a + n + 1); a[0] = 0; // 设置边界值,防止数组越界 // 核心算法:从价格最高的糖果开始,每3个一组处理 // 策略:只支付每组中价格最高的2个糖果,最便宜的1个糖果通过活动免费获得 for(int i = n; i > 0; i -= 3){ s += a[i] + a[i - 1]; // 支付当前组最贵的两个糖果 } cout << s; // 输出最小总花费 return 0; } -
0
#include<bits/stdc++.h> using namespace std; int a[11000]; // 自定义比较函数,名称改为cmp,功能不变(实现从大到小排序) bool cmp(int x, int y) { return x > y; // x大于y时,x排在y前面 } int main() { int n; cin >> n; for(int i = 1; i <= n; i++) { cin >> a[i]; } // 排序时使用自定义的cmp函数 sort(a + 1, a + n + 1, cmp); int s = 0; for(int i = 1; i <= n; i++) { // 每3个一组,第3个(i%3==0)免费,其余付费 if(i % 3 != 0) { s += a[i]; } } cout << s << endl; return 0; }
- 1