牛客网--删数

有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

输入描述:

每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算。

输出描述:

一行输出最后一个被删掉的数的原始下标位置。

输入例子1:

8

输出例子1:

6

 思路

这道题其实就是一道约瑟夫环问题,

可以直接用反推法求解;

已经知道最后一个数字的下标为0,

反推两个数的时候,该数字的下标;

......

以此类推,反推出n个数时的下标

#include<iostream>
using namespace std;
 
int main(){
    int n;
    while(cin>>n){
        n= n> 1000? 999: n;
        int result= 0;
        for(int i= 2; i<= n; ++i){
            result= (result+ 3)% i;
        }
        cout<<result<<endl;
    }
    return 0;
}
发布了208 篇原创文章 · 获赞 28 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/105369153