1 solutions

  • 0
    @ 2025-11-5 15:08:05

    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