VJ链接
题意:
给出一个n,代表从1到n,有两种操作
1:现存所有数中的偶数位得数踢掉,剩下的数靠拢
2:现存所有数中得3得倍数位置踢掉,剩下的数靠拢
操作1,2,轮流使用,直到剩余不超过3个数时停止,输出剩余的数
(我感觉,,这题题意挺迷的。之前以为每次仅踢掉第二个或者第三个数)
思路:
用一个数组记录数据初始位置,然后每次把要踢掉的数赋予一个大数,然后从大到小排列数据。操作2,3轮流。
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 6000
int a[N];
int main()
{
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++) a[i]=i;
while(n>3){
for(int i=1;i<=n;i++)
if(i%2==0) a[i]=N;
sort(a+1,a+1+n);
n-=n/2;
if(n<=3) break;
for(int i=1;i<=n;i++)
if(i%3==0) a[i]=N;
sort(a+1,a+1+n);
n-=n/3;
}
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
return 0;
}