| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
二分WA的童鞋注意一下写法正确的写法:
void solve()
{
double left = 0.0;
double right = 0.0;
for (int i = 0; i < N; i++)
right = max(right, 1.0 * value[i] / weight[i]);
while (1)
{
double mid = (left + right) / 2.0;
for (int i = 0; i < N; i++)
{
item[i].idx = i + 1;
item[i].prior = value[i] - mid * weight[i];
}
sort(item, item + N);
double sum = 0.0;
for (int i = 0; i < K; i++)
sum += item[N - K + i].prior;
if (sum >= 0.0)
{
left = mid;
if (right - left < 1e-7)
break; //跳出二分时需要保证运行结果是可行解
}
else
right = mid;
}
sort(item + N - K, item + N, cmpIdx);
for (int i = 0; i < K; i++)
printf("%d ", item[N - K + i].idx);
}
错误的写法:
(跳出二分时,item数组中存储的可能不是可行解)
void solve()
{
double left = 0.0;
double right = 0.0;
for (int i = 0; i < N; i++)
right = max(right, 1.0 * value[i] / weight[i]);
while (right - left >= 1e-7)
{
double mid = (left + right) / 2.0;
for (int i = 0; i < N; i++)
{
item[i].idx = i + 1;
item[i].prior = value[i] - mid * weight[i];
}
sort(item, item + N);
double sum = 0.0;
for (int i = 0; i < K; i++)
sum += item[N - K + i].prior;
if (sum >= 0.0)
left = mid;
else
right = mid;
}
sort(item + N - K, item + N, cmpIdx);
for (int i = 0; i < K; i++)
printf("%d ", item[N - K + i].idx);
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator