地址: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;
}
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; }