本文主要是介绍士兵队列训练问题(思维题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;
}
这篇关于士兵队列训练问题(思维题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!