zoukankan      html  css  js  c++  java
  • 简单模拟——松鼠吃果子

    ·这是一道样例说明错了的题;修改样例说明:3,8,5,9。

    ·就是这个样例说明,把我坑害了半个多小时。

    ·洛谷入口:P2069.

    ·题目:

    有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跳吃到的果子)的标号是什么?

    ·思路:

    数组不断下坠。

    图为跳完第一次,第二次,第三次数组的值。

    ·代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    int n,m,t;
    int a[10005];
    int yx(int a)
    {
    	return (a*a*a)%5+1;
    }
    void down(int x,int end)
    {
    	for(int i=x;i<=end;i++)
    	{
    		a[i]=a[i+1];
    		}
    }
    int main()
    {
    	cin>>n>>m;
    	int last;
    	int step=1;
    	t=n;
    	for(int i=1;i<=n;i++)
    	a[i]=i; 
    	for(int i=1;i<=m;i++)
    	{
    		int s;
    		s=yx(i);//跳过个数
    		if(step+s<=t)//若没有超出界限
    		{
    		    last=step+s;//所吃果子的位置
    		    step+=s;
    		    if(i!=m)
    			{t--;//最高点位置坐标——因下坠一个,所以最高点个数也下坠一个
    		    down(step,t);//数组下坠
    				}
    			}
    		else//若超出界限
    		{
    			step=1;//跳到最底下第一个果子
    		    last=step+s;
    		    step+=s;
    		    if(i!=m)
    			{
    				t--;
    		    down(step,t);
    				}
    			}
    		}
    	cout<<a[last]<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    ElasticSearch 深度搜索、滚动搜索,批量操作
    ElasticSearch搜索
    Elasticsearch 建立ik中文分词器和自定义分词
    React-Redux
    高阶组件-HOC
    React Context使用
    将秒数转换为时分秒格式
    『TensorFlow』TF2的模型保存
    『一图流』基于CRNN的OCR张量流概览
    Dapr微服务应用开发系列0:概述
  • 原文地址:https://www.cnblogs.com/konglingyi/p/11299436.html
Copyright © 2011-2022 走看看