1 条题解

  • 0
    @ 2025-8-24 22:23:34

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 22:23:34,当前版本为作者最后更新于2020-08-11 14:29:57,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    『MdOI R3』Operations

    对着数据范围做题。

    首先,当 a=0a=0b=0b=0 时,显然是不用代价的,即代价为 00

    a=0a=0 时,显然可以用一次 22 操作,使得 aa 乘上一个很大的数字,bb 除以一个很大的数字,这样 aa 还是 00bb 因为有下取整操作因此也会变成 00。当 b=0b=0 时同理可做。代价是 dd

    a=ba=b 时,显然可以用一次 11 操作,使得两数都减去 aa,这样两个数字都变成 00 了,代价是 cc。还有一个方法是让 aa 乘上一个很大的数字,bb 除以一个很大的数字,使得其变为 a0a\neq 0b=0b=0 的形式,使用上面的方法即可处理,代价是 2×d2 \times d,取最小值即可。

    aba \neq b 时,其实可以用一次 11 操作,使得 aa 变为 00,然后再用 a=0a=0b0b \neq 0 的方法去做(若 a>ba>b,则让 bb 变成 00),代价是 c+dc+d。还有一个方法是让 aa 乘上一个很大的数字,bb 除以一个很大的数字,使得其变为 a0a\neq 0b=0b=0 的形式,使用上面的方法即可处理,代价是 2×d2 \times d,取最小值即可。

    然后结合这些分析即可 AC 本题。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <cctype>
    #include <queue>
    #include <vector>
    
    using namespace std;
    
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    	return x*f;
    }
    
    int main()
    {
    	int a=read(),b=read(),c=read(),d=read();
    	if (a==0 && b==0)
    		puts("0");
    	else if (a*b==0)
    		cout << d << endl;
    	else if (a==b)
    		cout << min(c,2*d) << endl;
    	else
    		cout << min(c+d,2*d) << endl;
    	return 0;
    }
    
    • 1

    信息

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