HDU 1607(Station Balance)

分为两种情况:

  1. 小室数量 >= 样本数量,每个小室内放一个样本;
  2. 小室数量 < 样本数量,首先按样本重量从大到小排序,将重量最大的 2*C-S 个样本单独放置,剩余的样本一个最重的和一个最轻的组合放置。比如样本重量为 5,4,3,2,1,小室数量为 3,则 5 单独放置,4 和 1 组合放置,3 和 2 组合放置。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;

int cell[5]; //小室
double sum; //样本总质量
int C, S; //小室数,样本数

struct Specimen //样本
{
	int mass; //质量
	int order; //在输入中的顺序
	int group; //所属组号
	bool vis; //访问情况
}s[10];

//按照质量从大到小排序
bool cmp1(Specimen s1, Specimen s2)
{
	return s1.mass > s2.mass;
}

//按照输入顺序从小到大排序
bool cmp2(Specimen s1, Specimen s2)
{
	return s1.order < s2.order;
}

//计算IMBALANCE值
double Imbalance()
{
	double avg = sum / C;
	double ans = 0;
	for (int i = 0; i < C; i++)
	{
		ans += fabs(cell[i] - avg);
	}
	return ans;
}

int main()
{
	int Case = 0;
	while (cin >> C >> S)
	{
		memset(cell, 0, sizeof(cell));
		sum = 0;
		if (C >= S) //小室数量 >= 样本数量
		{
			for (int i = 0; i < S; i++)
			{
				cin >> s[i].mass;
				sum += s[i].mass;
				cell[i] = s[i].mass;
			}
			cout << "Set #" << ++Case << endl;
			for (int i = 0; i < S; i++)
			{
				cout << " " << i << ": " << s[i].mass << endl;
			}
			cout << "IMBALANCE = " << fixed << setprecision(5) << Imbalance() << endl << endl;
		}
		else //小室数量 < 样本数量
		{
			int single = 2 * C - S; //只有一个数的格子的数量
			for (int i = 0; i < S; i++)
			{
				cin >> s[i].mass;
				sum += s[i].mass;
				s[i].order = i;
				s[i].vis = 0;
			}

			sort(s, s + S, cmp1); //按照样本重量从大到小排序
			for (int i = 0; i < single; i++) //单独放置single个最重的样本
			{
				cell[i] = s[i].mass;
				s[i].group = i;
			}
			for (int i = single; i < single + (S - single) / 2; i++) //两两组合放置剩余样本
			{
				cell[i] = s[i].mass + s[single + S - 1 - i].mass;
				s[i].group = s[single + S - 1 - i].group = i;
			}

			cout << "Set #" << ++Case << endl;
			sort(s, s + S, cmp2); //还原为输入顺序
			for (int i = 0; i < C; i++)
			{
				cout << " " << i << ": ";
				int j;
				for (j = 0; j < S; j++)
				{
					if (!s[j].vis)
					{
						cout << s[j].mass;
						s[j].vis = true;
						break;
					}
				}
				for (int k = j + 1; k < S; k++)
				{
					if (s[k].group == s[j].group)
					{
						cout << " " << s[k].mass;
						s[k].vis = true;
						break;
					}
				}
				cout << endl;
			}
			cout << "IMBALANCE = " << fixed << setprecision(5) << Imbalance() << endl << endl;
		}
	}
	return 0;
}

继续加油。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值