T1:station
题目描述:
小 VHOS 带着 N 颗山楂球来到 A 班的阵地准备缩到位置上吃山楂球。
但是 A 班大佬们太强了,所以小 VHOS 每经过一个 A 班大佬身边, 他都需要交出他
手中一半的山楂(向下取整);
但是 A 班大佬看在小 VHOS 没吃午饭,都会从他们所拿的那一半中额外留出一颗山
楂球给小 VHOS。
经过重重的关口,小 VHOS 只剩下 X 颗山楂,他的午饭没了 qwq…小 VHOS 很菜,
他心情慌张,连自己还剩几颗山楂都不知道了 qwq…
所以帮小 VHOS 统计剩余山楂的任务就交给了你。
输入格式:
一行 2 个整数 N, M,表示原先带到 A 班的山楂总数, A 班同学的人数。
输出格式:
一行整数,表示小 VHOS 剩余的山楂球个数。
样例数据:
Sample Input Sample Output
8 1 5
数据规模与运行资源限制
对于 30%的数据, N≤10, M≤3;
对于 80%的数据, N≤1×105, M≤20;
对于 100%的数据, N≤1×107, M≤2×109;
如果你一看,这道题就是一个模拟,即80分,具体实现如下:
1.假设剩下的数量为n,则会取走n/2
2.那么会剩下n-n/2
3.因为A班的人很同情它要+1,所以剩下的是n=n-n/2+1
4.然后枚举1-i,n不断减少即可
假如你想拿100分,则必须要减少优化:
1.可以看出M>N,所以N除到一定大小的时候会在一个固定的数字徘徊
2.不难发现:2-2/2+1=2;3-3/2(c++运算下)+1=3时值保持固定不变,故加上特判对其优化即可.
具体代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("station.in","r",stdin);
freopen("station.out","w",stdout);
int n,m;
cin>>n>>m;
for (int i=1;i<=m;i++)
{
int take=n/2;
n-=take;
n++;
if (n==2||n==3) break;
}
cout<<n;
fclose(stdin);
fclose(stdout);
return 0;
}
T2:stairs
题目描述
OpportunityFan(以下简称 OF)正在准备体育考试,他为跳远感到忧愁。