UVa Problem Solution: 10037 - Bridge
2008-11-20 14:19
513 查看
Given the two fastest people as f1 and f2, f1 < f2, and the two slowest people as s1 and s2, s1 < s2. We want to use the two fastest people to bring the two slowest people to cross the bridge. There are two efficient ways of doing this:
1) f1, f2 go --> f1 back --> s1, s2 go --> f2 back: time1 = f2 + f1 + s2 + f2
2) f1, s1 go --> f1 back --> f1, s2 go --> f1 back: time2 = s1 + f1 + s2 + f1
Then, we can compare time1 with time2 to choose the better way.
Code:
/*************************************************************************
* Copyright (C) 2008 by liukaipeng *
* liukaipeng at gmail dot com *
*************************************************************************/
/* @JUDGE_ID 00000 10037 C++ "Bridge" */
#include <algorithm>
#include <deque>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int const timecount = 1000;
void cross_bridge(int *times, int ntimes, int strategy[][2])
{
sort(times, times + ntimes);
int i = 0;
for (; i < ntimes / 2 - 1; ++i) {
int time1 = times[1] + times[0] + times[ntimes-2*i-1] + times[1];
int time2 = times[ntimes-2*i-1] + times[0] + times[ntimes-2*i-2] + times[0];
if (time1 < time2) {
strategy[4*i+1][0] = times[0];
strategy[4*i+1][1] = times[1];
strategy[4*i+2][0] = times[0];
strategy[4*i+3][0] = times[ntimes-2*i-2];
strategy[4*i+3][1] = times[ntimes-2*i-1];
strategy[4*i+4][0] = times[1];
strategy[0][0] += time1;
} else {
strategy[4*i+1][0] = times[0];
strategy[4*i+1][1] = times[ntimes-2*i-1];
strategy[4*i+2][0] = times[0];
strategy[4*i+3][0] = times[0];
strategy[4*i+3][1] = times[ntimes-2*i-2];
strategy[4*i+4][0] = times[0];
strategy[0][0] += time2;
}
}
strategy[4*i+1][0] = times[0];
strategy[4*i+1][1] = times[1];
strategy[0][0] += times[1];
if (ntimes % 2 == 1) {
strategy[4*i+2][0] = times[0];
strategy[4*i+3][0] = times[0];
strategy[4*i+3][1] = times[2];
strategy[0][0] += times[0] + times[2];
}
}
int main(int argc, char *argv[])
{
#ifndef ONLINE_JUDGE
filebuf in, out;
cin.rdbuf(in.open((string(argv[0]) + ".in").c_str(), ios_base::in));
cout.rdbuf(out.open((string(argv[0]) + ".out").c_str(), ios_base::out));
#endif
int ncases;
cin >> ncases;
while (ncases-- > 0) {
int ntimes;
cin >> ntimes;
int times[timecount];
for (int i = 0; i < ntimes; ++i) cin >> times[i];
if (ntimes < 2) {
cout << times[0] << '/n' << times[0] << '/n';
} else {
int strategy[(timecount-1)*2][2] = {{0}};
cross_bridge(times, ntimes, strategy);
for (int i = 0; i < (ntimes - 1) * 2; ++i) {
cout << strategy[i][0];
if (i % 2 == 1) cout << ' ' << strategy[i][1];
cout << '/n';
}
}
if (ncases > 0) cout << '/n';
}
return 0;
}
1) f1, f2 go --> f1 back --> s1, s2 go --> f2 back: time1 = f2 + f1 + s2 + f2
2) f1, s1 go --> f1 back --> f1, s2 go --> f1 back: time2 = s1 + f1 + s2 + f1
Then, we can compare time1 with time2 to choose the better way.
Code:
/*************************************************************************
* Copyright (C) 2008 by liukaipeng *
* liukaipeng at gmail dot com *
*************************************************************************/
/* @JUDGE_ID 00000 10037 C++ "Bridge" */
#include <algorithm>
#include <deque>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int const timecount = 1000;
void cross_bridge(int *times, int ntimes, int strategy[][2])
{
sort(times, times + ntimes);
int i = 0;
for (; i < ntimes / 2 - 1; ++i) {
int time1 = times[1] + times[0] + times[ntimes-2*i-1] + times[1];
int time2 = times[ntimes-2*i-1] + times[0] + times[ntimes-2*i-2] + times[0];
if (time1 < time2) {
strategy[4*i+1][0] = times[0];
strategy[4*i+1][1] = times[1];
strategy[4*i+2][0] = times[0];
strategy[4*i+3][0] = times[ntimes-2*i-2];
strategy[4*i+3][1] = times[ntimes-2*i-1];
strategy[4*i+4][0] = times[1];
strategy[0][0] += time1;
} else {
strategy[4*i+1][0] = times[0];
strategy[4*i+1][1] = times[ntimes-2*i-1];
strategy[4*i+2][0] = times[0];
strategy[4*i+3][0] = times[0];
strategy[4*i+3][1] = times[ntimes-2*i-2];
strategy[4*i+4][0] = times[0];
strategy[0][0] += time2;
}
}
strategy[4*i+1][0] = times[0];
strategy[4*i+1][1] = times[1];
strategy[0][0] += times[1];
if (ntimes % 2 == 1) {
strategy[4*i+2][0] = times[0];
strategy[4*i+3][0] = times[0];
strategy[4*i+3][1] = times[2];
strategy[0][0] += times[0] + times[2];
}
}
int main(int argc, char *argv[])
{
#ifndef ONLINE_JUDGE
filebuf in, out;
cin.rdbuf(in.open((string(argv[0]) + ".in").c_str(), ios_base::in));
cout.rdbuf(out.open((string(argv[0]) + ".out").c_str(), ios_base::out));
#endif
int ncases;
cin >> ncases;
while (ncases-- > 0) {
int ntimes;
cin >> ntimes;
int times[timecount];
for (int i = 0; i < ntimes; ++i) cin >> times[i];
if (ntimes < 2) {
cout << times[0] << '/n' << times[0] << '/n';
} else {
int strategy[(timecount-1)*2][2] = {{0}};
cross_bridge(times, ntimes, strategy);
for (int i = 0; i < (ntimes - 1) * 2; ++i) {
cout << strategy[i][0];
if (i % 2 == 1) cout << ' ' << strategy[i][1];
cout << '/n';
}
}
if (ncases > 0) cout << '/n';
}
return 0;
}
相关文章推荐
- UVa Problem 10037 Bridge (过桥)
- UVA 10037 - Bridge
- UVA-10037 Bridge 模拟+dfs
- UVa Problem Solution: 10196 - Check The Check
- UVa Problem Solution: 848 - Fmt
- UVa Problem Solution: 10026 - Shoemaker's Problem
- UVa Problem Solution: 10105 - Polynomial Coefficients
- UVa Problem Solution: 846 - Steps
- UVa Problem Solution: 10104 - Euclid Problem
- UVa Problem Solution: 861 - Little Bishops
- UVa10037 - Bridge
- UVa Problem Solution: 100 - The 3n+1 problem
- UVa Problem Solution: 10142 - Australian Voting
- UVa Problem Solution: 10010 - Where's Waldorf
- UVa Problem Solution: 10041 - Vito's Family
- UVa Problem Solution: 10077 - The Stern-Brocot Number System
- UVa Problem Solution: 10006 - Carmichael Numbers
- UVa Problem Solution: 10089 - Repackaging
- UVA10037 Bridge【贪心】
- uva 10037 - Bridge(贪心)