专栏文章

帮佳代子抓小猫的个人思路

题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minylgar
此快照首次捕获于
2025/12/02 10:28
3 个月前
此快照最后确认于
2025/12/02 10:28
3 个月前
查看原文

题目传送门

进食后人:

a 数组不一定有序。 栽到这个坑的乖乖举个抓抓QWQ

思路:

在只有正方向的数轴上走往返运动,首先往返的时间是一致的,路程是一致的,速度是一致的。
根据 样例1:
输入:
CPP
3
1 2 6
10
输出:
CPP
2
抓住第一只猫需要 11 秒,往返运动 22 秒,第二只猫相对于原来位置移动了 22 ,可以用一个 cntcnt 数组存储每只小猫移动的距离,即第 xx 只小猫移动的距离为 cntxcnt_x
设第 xx 只小猫初始在 axa_x 的位置,则小猫与原点的距离为原来位置加上移动的距离,即: Sx=(cntx+ax)S_x = (cnt_x + a_x)
由速度差为 11 可以知道想要追上第 xx 小猫,需要 t 单程=(cntx+ax)t_{\ 单程} = (cnt_x + a_x) 的时间。
往返时间相同,则一次往返要 t 往返=2 (cntx+ax)t_{\ 往返} = 2\ (cnt_x + a_x) 的时间。
而小猫移动的时间及相对于原位置移动的时间为:
cntx=2 (cntx1+ax1)cnt_x = 2\ (cnt_{x - 1} + a_{x - 1}).
先初始化第 00 只小猫 cnt0=0,a0=0cnt_0 = 0,a_0 = 0,根据递推原理求出 cnt1,cnt2,cnt3......cntncnt_1,cnt_2,cnt_3......cnt_n
CPP
cnt[i] = cnt[i - 1] + 2 * (cnt[i - 1] + a[i - 1]);
由于 cntcnt 数组每次数值只用一次,可以直接把 cntcnt 数组压缩成变量:
CPP
cnt += 2 * (cnt + a[i]);
每次将 cntcnt 与总时间比较来判断是否可以继续抓。

Code:

CPP
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
template<typename T> void re(T&x){x = 0; int sign = 1; char c;do{c = getchar(); if (c == '-') sign = -1;}while(!isdigit(c)); do{x = x * 10 + c - '0'; c = getchar();}while(isdigit(c)); x *= sign;}
void write(int x){if (x < 0) x = -x, putchar('-'); if (x < 10) putchar(x + '0'); else write(x / 10), putchar(x % 10 + '0');}

const int N = 2e6 + 100;

ll n;
ll t;
ll a[N];

bool cmp(ll x, ll y){
	return x < y;
}

int main(){
	re(n);
	for (int i = 1; i <= n; i ++) re(a[i]);
	re(t);
	ll ans = 0, cnt = 0;
	sort(a + 1, a + n + 1, cmp);
	ll l = 1;
	while (cnt <= t){
		cnt += (a[l] + cnt) * 2;
        if (cnt > t) break;
		ans ++;
		l ++;
	}
	printf("%lld", ans);
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...