地址:http://codeforces.com/contest/1272

A. Three Friends

仔细读题能够发现|a-b| + |a-c| + |b-c| = |R-L|*2 (其中L = min{a, b, c}, R = max{a, b, c})

那么本题的移动条件就只考虑两个端点L, R即可,答案即为 |(L+1)-(R-1)| 即L向右移动1,R向左移动1,在此之前判断一下原L,R之间的距离是否<=2,<=2输出0

#include <bits/stdc++.h>
using namespace std;

int q, a[3];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> q;
    while( q-- ){
        for( int i=0; i<3; i++ ) cin >> a[i];
        sort(a, a+3);
        if( a[2]-a[0]<=2 ) cout << "0" << endl;
        else cout << (a[2]-a[0]-2)*2 << endl;
    }

    return 0;
}
A.Three Friends

B.Snow Walking Robot

这题比赛时没做出来??理解题意出了锅。

思路:如果能够回到(0, 0)需满足数量U=D且R=L,只需要上下方向选min(U, D),左右方向选min(L, R)。

如果U=0或D=0那么就要删除所有的另外一个方向,且将左右方向置为1(min(L, R)>0),对于R和L也一样要满足该条件,上下方向置为1(min(U, D)>0)

然后最后组合的时候只需要让路径构成一个环即可,这个组合可以任意组合,做题的时候卡在这了。。。

#include <bits/stdc++.h>
using namespace std;

int q, cl, cr, cu, cd;
string s;
int main(){
    // freopen("in.txt", "r", stdin);
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> q;
    while( q-- ){
        cin >> s;
        cl = cr = cu = cd = 0;
        for( char i:s ){
            cl += i=='L';
            cr += i=='R';
            cu += i=='U';
            cd += i=='D';
        }
        cu = min(cu, cd);
        cl = min(cl, cr);
        if( cu==0 || cl==0 ){
            cl = min(1, cl);
            cu = min(1, cu);
        }
        string ans;
        for( int i=0; i<cl; i++ ) ans += 'R';
        for( int i=0; i<cu; i++ ) ans += 'U';
        for( int i=0; i<cl; i++ ) ans += 'L';
        for( int i=0; i<cu; i++ ) ans += 'D';
        cout << ans.size() << endl << ans << endl;
    }

    return 0;
}
B.Snow Walking Robot

相关文章: