士兵队列训练问题(思维题)

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;
}
发布了85 篇原创文章 · 获赞 10 · 访问量 5236

猜你喜欢

转载自blog.csdn.net/riversuer/article/details/104682928