习题8-8(uva-1612)

本文主要探讨了一篇关于算法竞赛的代码实现,涉及多种数据结构如栈、队列、集合、映射等,并运用了动态规划策略求解问题。通过实例展示了如何在C++中高效地处理和比较数组,以及在没有解决方案时的判断逻辑。此外,还讨论了多线程、互斥锁和条件变量在算法优化中的应用。
#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>


#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const int maxn = 2 * 1e4 + 7;
struct Member
{
	int score[8];
}mb[maxn];
int n,ans,ids[maxn];

int GetResult()
{
	ans = mb[ids[1]].score[7];
	for (int i = 2; i <= n; i++) {
		int id = ids[i];
		int index = lower_bound(mb[id].score, mb[id].score + 8, ans) - mb[id].score;
		//都小于
		if (index == 8) {
			ans = mb[id].score[index - 1];
		}
		else if (index == 0) {
			if (ans == mb[id].score[index] && id > ids[i - 1]) ans = mb[id].score[index];
			else return 0;
		}
		else {
			if (mb[id].score[index] > ans || (mb[id].score[index] == ans && id <= ids[i - 1])) ans = mb[id].score[index - 1];
			else ans = mb[id].score[index];
		}
	}
	return 1;
}
int main()
{
	int kcase = 0;
	while (cin >> n && n) {
		int a[3];
		double b[3];
		for (int i = 1; i <= n; i++) {
			cin >> b[0] >> b[1] >> b[2];
			for (int j = 0; j < 3; j++)
				a[j] = (int)(round(b[j] * 100.0));
			
			for (int j = 0; j <= 7; j++) {
				mb[i].score[j] = 0;
				for (int k = 0; k < 3; k++)
					if (j & (1 << k)) mb[i].score[j] += a[k];
			}
			sort(mb[i].score, mb[i].score + 8);
		}

		for (int i = 1; i <= n; i++) cin >> ids[i];

		cout << "Case " << ++kcase << ": ";

		if (GetResult()) cout << fixed << setprecision(2) << ans / 100.0 << endl;
		else cout << "No solution" << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值