聪明的情侣算法题
酋长的女儿艾丽要出嫁了,按以往的风俗习惯,要搭个高台,台下是众多的求婚者,艾丽在台上扔束花,扔在台下谁身上,艾丽就得嫁给谁。但她担心落不到心爱的雷蒙身上。艾丽私下约雷蒙商量如何是好。雷蒙想出了一个主意……艾丽便和父亲说:“我不愿意搭台撒花,这么多人来,挤在一起乱哄哄的,没秩序。”父亲说,“不这样也可以,但结婚时要当场在人群中决定嫁给谁,不许指名,方法你自己定。”艾丽高兴的告诉主持人如何行事。婚日来临,人群拥挤,主持人叫求婚者排成一队,雷蒙在队外数了数队列共有101人,于是自己找了个合适的位置也站在队列中,主持人要大家从前往后1,2,1,2……报数,报单数的退出场外,余下的人位置不变,再重新从前往后1,2,1,2……报数,报单数的退场,如此下去最后只剩一人,艾丽便嫁给谁。大家惊奇的发现最后剩下的竟是雷蒙。请用程序回答雷蒙刚开始站在队列中的第几个位置。
以下是某前辈的代码。 (C++)
int main(){ int pos[102]; int persons = 102; for (int i = 0; i < 102; i++) { pos[i] = i + 1; } while (persons != 1) { for (int i = 0, k = 1; k < persons; i++, k += 2) { //pos[persons] 中保留剩下的人, 往前拷贝。 pos[i] = pos[k]; } persons /= 2; } cout<<"雷蒙的位置是:"<<pos[0]<<endl;// pos[0] 就是最后剩下的位置 也就是雷蒙的位置 }
以下是我的代码———————捂脸!(C#)
感觉自己写的实在是太菜了,要继续努力
public static void main() { int[] people = new int[103]; for (int i = 1; i < people.Length; i++) { people[i] = i; } while (people[2] != 0) { for (int i = 1; i < people.Length; i++) { if (i % 2 != 0) { people[i] = 0; } } people = fill(people); } Console.WriteLine("雷蒙站在:" + people[1].ToString()); } public static int[] fill(int[] OldArr) { int[] NewArr = new int[OldArr.Length]; int now = 1; for (int i = 0; i < OldArr.Length; i++) { if (OldArr[i] != 0) { NewArr[now] = OldArr[i]; now++; } } return NewArr; }