1 solutions
-
0
C++ :
#define FOR_EACH(i,c) for(auto (i) = (c).begin(); (i) != (c).end(); (i)++) #include<algorithm> //#include<array> #include<bitset> #include<complex> #include<deque> //#include<forward_list> #include<functional> #include<iostream> #include<limits> #include<list> #include<map> #include<string.h> #include<numeric> #include<queue> #include<set> #include<stack> #include<utility> #include<vector> const long double PI = 2*acos(.0L); typedef long long LLONG; typedef unsigned long long ULLONG; using namespace std; int f[1000][1000]; pair<short, short> prior[1000][1000], res; bool inQ[1000][1000]; queue<pair<short, short>> q; vector<pair<short, short>> res1; void relax(short t0, pair<short, short> u, pair<short, short> v) { if(f[v.first][v.second]<=f[u.first][u.second]+t0) return; f[v.first][v.second] = f[u.first][u.second]+t0; prior[v.first][v.second] = u; if(!inQ[v.first][v.second]) { q.push(v); inQ[v.first][v.second] = 1; } } int main() { short a, b, c; while(~scanf("%hd%hd%hd", &a, &b, &c)) { memset(f, 0x7f, sizeof(f)); f[0][0] = 0; memset(prior, -1, sizeof(prior)); inQ[0][0] = 1; q.push(make_pair(0, 0)); res.first = -1; while(!q.empty()) { pair<short, short> u = q.front(); short t0; q.pop(); inQ[u.first][u.second] = 0; if(((u.first==c && u.second==0) || (u.second==c && u.first==0)) && (res.first==-1 || f[u.first][u.second]<f[res.first][res.second])) res = make_pair(u.first, u.second); relax(u.first, u, make_pair(0, u.second)); relax(0, u, make_pair(a, u.second)); relax(u.second, u, make_pair(u.first, 0)); relax(0, u, make_pair(u.first, b)); t0 = min(u.first+0, b-u.second); relax(0, u, make_pair(u.first-t0, u.second+t0)); t0 = min(a-u.first, u.second+0); relax(0, u, make_pair(u.first+t0, u.second-t0)); } if(res.first == -1) puts("No solution!"); else { printf("%d\n", f[res.first][res.second]); /* res1.clear(); for(; res.first != -1; res = prior[res.first][res.second]) res1.push_back(res); printf("(0, 0)"); for(vector<pair<short, short>>::reverse_iterator i = res1.rbegin()+1; i != res1.rend(); i++) printf(" -> (%hd, %hd)", i->first, i->second); puts(""); */ } } return 0; }
- 1
Information
- ID
- 16436
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By