Vijos_P1078_松鼠吃果子_解题报告_C

来源:互联网 发布:linux远程连接 编辑:程序博客网 时间:2024/04/30 19:55

先贴出题目出处

简单题

-------------------------------------------------------------------------------------题目----------------------------------------------------------------------------------------------

描述 Description
     有N个一种松鼠喜欢吃的果子由下向上串排成一列,并标号1,2,...N。一只松鼠从最下果子开始向上跳,并且第i次
跳可以一次跳过 i*i*i 除以5的余数+1个果子(=i*i*i%5+1),并把脚下的果子吃了,如果上面有果子,在重力作用下,都将向下掉下
一格。如第1次跳从第一个果子上跳过1*1*1%5+1=2个果子,可跳到第3个果子上,并把第3个果子吃了;第2次从第4个果子上(落在
原来第三个果子位置)跳过2*2*2%5+1=4个到第8个果子上,并把第8个吃了;如此...。 
   当然,总有一次松鼠会跳出这串果子的最前面,设为每K次,它吃不到任何果子了。这时它回到最下面的果子上,重做它的第
K次跳,以求吃到果子。如此,问它吃的第m只果子(即第M跳吃到的果子)的标号是什么?

输入格式 Input Format
  一共两行,分别为N和m。(1<=m<=n<=200,并且满足能够跳到第m次)
输出格式 Output Format
  一个数,即它吃的第m只果子的标号。
样例输入 Sample Input
10
4
样例输出 Sample Output
9


-------------------------------------------------------------------------------------代码----------------------------------------------------------------------------------------------


C语言:

#include <stdio.h>#define   MAX 210    //定义数组的大小int    fruit[MAX];   int    m;//参数分别为:指向果子数组的指针fruit、果子总数Nint fun(int *fruit, int N);int main(void){int    N;int    i;scanf("%d %d", &N, &m);fruit[0] = 0;//将第一个元素置零.注意:即从下标1开始//初始化数组fruitfor (i = 1; i <= N; i++){fruit[i] = i;}printf("%d\n",fun(fruit, N));return  0;}int fun(int *fruit, int N){int    j;//循环变量int    i = 1;//存储第m次跳跃的变量,初始化为第一次int    jump_num;//跳过的果子数int    fruit_value;//当是最后一次的时候,用此变量记录果子值int    now_position = 1;//记录当前所在的果子位置for ( ; i <= m; i++){jump_num = i * i * i % 5 + 1;//计算跳跃的果子数now_position = jump_num + now_position;//记录当前所在的果子位置//判断此位置是否已跳出if (fruit[now_position] == 0) {now_position = 1 + jump_num;    //若是跳出则从头开始跳}//检测是否最后一次if (m == i) {fruit_value = fruit[now_position];//若是则保存当前位置的值}for (j = now_position ; j <= N; j++){fruit[j] = fruit[j+1];}N -= 1;//因为吃了一个果子,则需要将果子总数减一}return   fruit_value;}







原创粉丝点击