题意:数轴上有n个点,给定3种票,分别能走1 2 3,数量分别为a b c,a+b+c=n,每次只能依靠票来移动,找到一种移动序列
分析:这题又很玄乎了,总感觉在做奥数题,需要找到特定的规律,看大佬的代码,才知道怎么写,先将3这个票数移动完,然后使得移动完之后3的左边是没有空位置的,一开始拿到题目,我也想到了这一点,但是没往下再想。。因为每种票数量都大于3,所以总能找到一种方法使得3移动完,移动完3之后再移动1,将1移动到只剩下1个,再移动2。
#include<iostream>
#include<string.h>
#include<sstream>
#include<set>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<math.h>
using namespace std;
int n;
int ans[1500 + 10];
int main() {
int kase;
cin >> kase;
while (kase--) {
int a, b, c;
cin >> a >> b >> c;
int len = 0;
int pos = 0;
ans[len++] = 0;
if (c % 3 == 0) {
for (int i = 0; i < c / 3; i++)ans[len++] = (pos += 3);
ans[len++] = ++pos;
a--;
for (int i = 0; i < c / 3; i++)ans[len++] = (pos -= 3);
ans[len++] = ++pos;
a--;
for (int i = 0; i < c / 3; i++)ans[len++] = (pos += 3);
}
if (c % 3 == 1) {
for (int i = 0; i < c / 3 + 1; i++)ans[len++] = (pos += 3);
ans[len++] = (pos -= 2); b--;
for (int i = 0; i < c / 3; i++)ans[len++] = (pos -= 3);
ans[len++] = (pos += 1); a--;
for (int i = 0; i < c / 3; i++)ans[len++] = (pos += 3);
ans[len++] = (pos += 2); b--;
}
if (c % 3 == 2) {
for (int i = 0; i < c / 3 + 1; i++)ans[len++] = (pos += 3);
ans[len++] = (pos -= 1); a--;
for (int i = 0; i < c / 3; i++)ans[len++] = (pos -= 3);
ans[len++] = (pos += 1); a--;
for (int i = 0; i < c / 3+1; i++)ans[len++] = (pos += 3);
}
while (a-- > 1)ans[len++] = ++pos;
for (int i = 0; i < (b + 1) / 2; i++)ans[len++] = (pos += 2);
if (b % 2)ans[len++] = --pos;
else ans[len++] = ++pos;
for (int i = b & 1; i < (b + 1) / 2; i++)ans[len++] = (pos -= 2);
for (int i = 0; i < len-1; i++)cout << ans[i]<<" ";
cout << ans[len - 1] << endl;
}
return 0;
}