Failed | ||||||
| ||||||
Description | ||||||
蛋糕破坏了,表白失败了。 | ||||||
Input | ||||||
本题有多组测试数据。 每组测试数据输入两个整数n和k,其中 (1 ≤ n ≤ 50000, 0 ≤ 2k ≤ n)。 | ||||||
Output | ||||||
对于每组测试,第一行输出2*n,第二行输出2n个数字。 要求满足序列P的规律,题目保证答案存在。 如果有多组数据,输出任意一种即可。 | ||||||
Sample Input | ||||||
1 0 | ||||||
Sample Output | ||||||
1 2 | ||||||
Hint | ||||||
第一组样例中|1-2|-|1-2|=0 第二组样例中|3-2|+|1-4|-|3-2+1-4|=1+3-2=2 第三组样例中|2-7|+|4-6|+|1-3|+|5-8|-|2-7+4-6+1-3+5-8|=12-12=0 | ||||||
Source | ||||||
2013级新生组队赛(11月)正式赛 |
思路:
假设我们此时n==4,那么无论K等于多少,前式都是这样的:
|a1-a2|+|a3-a4|+|a5-a6|+|a7-a8|-|a1-a2+a3-a4+a5-a6+a7-a8|;
我们不妨先将k置为0.
那么我们很容易找到一个解的序列:
1 2 3 4 5 6 7 8
使得解为:
(a2-a1)+(a4-a3)+(a6-a5)+(a8-a7)-(a2-a1+a4-a3+a6-a5+a8-a7);
那么接下来我们不妨将k再置为1.
我们思考怎样处理式子能够最方便的得到解?
显然是随便置换一组相邻的两个数,a1和a2换是可行的,a3和a4换也是可行的,a5和a6换也是可行的,同理,a7和a8换也是可行的。
当我们仔细去探究这个式子的时候发现,因为我们每组相邻的两个数,其值无非是1或者是-1(1 2放置就是-1.换了位子之后2 1放置就是1.).
初始的时候我们让每组的值都是-1.那么我们此时让任意一组变成1(也就是交换每组中相邻的两个数);那么其等式的整体值就会+1.
题目保证有解,而且2k<=n,很显然n组交换是可行的。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int ans[50000*4];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
for(int i=1;i<=2*n;i++)
{
ans[i]=i;
}
for(int i=2*n;i>=1;i-=2)
{
if(k>0)
{
swap(ans[i],ans[i-1]);
k--;
}
}
for(int i=1;i<=2*n;i++)
{
if(i==1)printf("%d",ans[i]);
else
printf(" %d",ans[i]);
}
printf("\n");
}
}