蓝桥杯——付账问题_2018年

这是我第一次做“算法竞赛”的算法题,之前没有参加过相关的练习,对于C++的理解不透彻。

付账问题
问题描述:问题描述
问题的简单分析:
首先这是一个“贪心问题”,为了使标准差最小,每一个人出的钱==bi==必须接近平均值。 
(1)ai<=bi时:必须交上所有的钱,这样才能保证标准差尽可能的小
(2)ai>bi时:这类人不仅要交平均值S/n,还要平摊没带够钱的人的费用
因此有:
#include<bits/stdc++.h>
using namespace std;
int main()
{
   int n;
   double S;
   cin >> n >> S;
   double a[n];
   for (int i = 0; i < n; i++)
   {
   	cin >> a[i];
   }
   //开始贪心选择
   sort(a, a + n);//进行排序
   double arg = S / n;
   double arg0 = arg;
   double ans = 0;
   for (int i = 0; i < n; i++)
   {
   	arg0 = S / (n - i);
   	if (a[i] < arg0)
   	{//没带够前,就全交 
   		S = S - a[i];
   		ans = ans + (a[i] - arg) * (a[i] - arg);
   	}
   	else
   	{//带够钱了,只需付当前的平均值 
   		ans += (arg0 - arg) * (arg0 - arg) * (n - i);
   		break;//如果这个人有钱付,那么其后面的人一定也能付 
   	}
   }
   printf("%.4lf", sqrt(ans / n));
   return 0;
}

折腾了一天,终于Ac了。虽然是第一次,但也暴露了太多的问题,首先就是对
于各种类型的范围不熟悉,此次之所以耗费时间之长,是因为对于类型的范围
的不熟悉所导致。这个贪心算法的基本思想和贪心选择性质一开始就想出,但
是后来的工作全部都在进行变量的调试,其中的S我最开始设置的是int类型
,在评判的时候,只通过了2个样本,后来看他人的工作,思想和核心代码
都本质上是一致的,而他人的参数S的类型为double,我试了一下,通过了。
   虽然题目要求S和N都是整数,但在后续中要对S进行改变,因此可以直
   接设为Double类型或者另加一个double类型的变量来接管S
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值