习题8-8(uva-1612)

#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;
}

猜你喜欢

转载自blog.csdn.net/seanbill/article/details/116902577