1 条题解

  • 0
    @ 2025-8-24 23:10:06

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Sunset_afterglow
    Wir werden den Zweiten Weltkrieg gewinnen || 我是羊我要开始说谎了 || 壶关条件:蓝题 50+ & 橙名及以上 & 除CTJ的人 || 人会背叛但OI不会,不会就是不会,怎么学都不会--Empty_Dream

    搬运于2025-08-24 23:10:06,当前版本为作者最后更新于2025-03-07 17:16:33,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思路

    首先当一次移动距离等于 00 就直接输出 a+ba+b
    因为天依如果不用自行车的话一个时间单位只能向上下左右走一个,所以如果不用的话,就是走 a+ba+b 个时间单位。
    然后考虑使用自行车,一次走 ll 个格子,一定是向下使用 xx 次,向右使用 yy 次,最后一格一格走到 (a,b)(a ,b),注意考虑她冲刺到了后面在倒退回来的情况,以及卡了我半小时的,注意其优化步数多的要优先考虑

    代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    inline int read() {
    	int x = 0 ,f = 1;
    	char ch = getchar();
    	while('0' > ch || ch > '9'){
    		if(ch == '-') f = -1;
    		ch = getchar();
    	}
    	while('0' <= ch && ch <= '9') {
    		x = (x << 1) + (x << 3) + (ch & 15);
    		ch = getchar();
    	}
    	return x * f;
    }
    int T ,a ,b ,k ,l ,x ,y ,ans1 ,ans2;
    signed main() {
    	T = read();
    	while(T --) {
    		a = read(); b = read(); k = read(); l = read();
    		if(l == 0) {
    			cout << a + b << '\n';
    			continue;
    		}
    		x = b / l ,y = a / l;
    		if(k >= x)k -= x ,ans1 = b - x * l;
    		else ans1 = b - k * l ,k = 0ll;
    		if(k >= y)k -= y ,ans2 = a - y * l;
    		else ans2 = a - k * l ,k = 0ll;
    		if(k > 0ll) {
    			if(ans1 > (l / 2) && ans2 > (l / 2) && ans2 > ans1) {
    				ans2 = l - ans2;
    				-- k;
    			}
    			if(k > 0 && ans1 > (l / 2)) {
    				ans1 = l - ans1;
    				-- k;
    			}
    			if(k > 0 && ans2 > (l / 2)) {
    				ans2 = l - ans2;
    				-- k;
    			}
    		}
    		cout << ans1 + ans2 << '\n';
    	}
    	return 0;
    }
    
    完结撒花(记得点赞)
    • 1

    信息

    ID
    8430
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者