top1编程
← 返回题目
题解

糖果

4 条题解

  • 0
    @ 2026-7-29 20:23:21
    #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
      @ 2026-7-29 0:06:30
      #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
        @ 2026-7-29 0:06:28
        #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
          @ 2026-7-28 23:12:25
          #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