[编程题]删数
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
有一个数组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
#include<stdio.h>
int findnext(int cur, int *a, int n){
while (a[(cur + 1)%n] == 0){
cur += 1;
}
return (cur+1)%n;
}
int main(){
int n;
while(~scanf("%d", &n)){
if(n>1000) n = 999;
int count = n;
int a[n];
for(int i = 0; i<n; i++){
a[i] = 1;
}
int i = -1;
for(; count>0; count--){
i = findnext(i, a, n);
i = findnext(i, a, n);
i = findnext(i, a, n);
a[i] = 0;
// for(int j = 0; j<n; j++){
// printf("%d ", a[j]);
// }printf("\n");
}
printf("%d\n", i);
}
}
用队列模拟,队首取数,用一个计数器计数,隔2个删一个,其他的重新放到队尾:
#include<iostream>
#include<queue>
using namespace std;
int main(){
int n;
while(cin>>n){
queue<int> q;
for(int i = 0; i<n; i++){
q.push(i);
}
int count = 0;
while(q.size()!=1){
if(count != 2){
int b = q.front();
q.pop();
q.push(b);
count++;
}
else{
q.pop();
count = 0;
}
}
int c = q.front();
cout<<c<<endl;
}
return 0;
}