Run Time: 0.000
Ranking (as of 2016-08-09): 25 out of 396
Language: C++
/*
UVa 11658 - Best Coalitions
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_11658_Best_Coalitions.cpp
*/
#include <cstdio>
#include <cstring>
const int n_max = 100, p_max = 10000;
int percentages[n_max + 1];
bool coalitions[p_max + 1];
int main()
{
while (true) {
int n, x;
scanf("%d %d", &n, &x);
if (!n)
break;
x--;
int px;
for (int i = 0, j = 0; i < n; i++) {
int integral, decimal;
scanf("%d.%d", &integral, &decimal);
percentages[j] = integral * 100 + decimal;
if (i == x)
px = percentages[j];
else
j++;
}
if (px > 5000) {
printf("%.2lf\n", 100.0);
continue;
}
memset(coalitions, 0, sizeof(coalitions));
int ci = 0;
for (int i = 0; i < n - 1; i++) {
int p = percentages[i];
for (int j = ci; j; j--)
if (coalitions[j])
coalitions[j + p] = true;
coalitions[p] = true;
ci += p;
#ifdef DEBUG
for (int j = 1; j <= ci; j++)
if (coalitions[j])
printf("%d%c", j, ((j < ci) ? ' ' : '\n'));
#endif
}
double sp = 0.0;
for (int i = 5001 - px; i <= ci; i++)
if (coalitions[i]) {
sp = static_cast<double>(px) * 100.0 / static_cast<double>(px + i);
break;
}
printf("%.2lf\n", sp);
}
return 0;
}
No comments:
Post a Comment