青少年编程知识记录 codecoming

小苹果(apple)

【题目描述】

小 Y 的桌子上放着n个苹果从左到右排成一列,编号为从1到n。

小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果。

每天在拿的时候,小苞都是从左侧第1个苹果开始、每隔2个苹果拿走2个苹果。随后小苞会将剩下的苹果按原先的顺序重新排成一列。

小苞想知道,多少天能拿完所有的苹果,而编号为n的苹果是在第几天被拿走的?

【输入描述】

输入的第一行包含一个正整数n,表示苹果的总数。

【输出描述】

输出一行包含两个正整数,两个整数之间由一个空格隔开,分别表示小苞拿走所有苹果所需的天数以及拿走编号为n的苹果是在第几天。

【样例输入】

8

【样例输出】

5 5

【提示】

说明/提示

【样例 1 解释】

小苞的桌上一共放了8个苹果。

小苞第一天拿走了编号为1、4、7的苹果。

小苞第二天拿走了编号为2、6的苹果。

小苞第三天拿走了编号为3的苹果。

小苞第四天拿走了编号为5的苹果。

小苞第五天拿走了编号为8的苹果。

【数据范围】

1n109 

测试点n≤特殊性质
1∼210
3∼5103
6∼7106
8∼9106
10109



特殊性质:小苞第一天就取走编号为n的苹果。

【题目分析】

  1. 题目有点“约瑟夫环”的感觉。

  2. 简单找找取模的规律。







【参考代码】

#include <bits/stdc++.h>  using namespace std;  int n, ans, num;  //n是苹果数量,ans记录天数,num记录第一次n%3==1的时间。  int main() {    cin >> n;    while (n) {      ans++;      //每过一天ans++。      if (n % 3 == 1 && !num) {        num = ans;      }      //如果n%3==1并且是第一次出现,记录num。      n = n - (n + 2) / 3;      //n每次减少1/3 n个苹果。    }    cout << ans << ' ' << num;    //输出天数和拿走第n个苹果的时间。    return 0;  }



(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:题解目录 浏览: