题解:P13632 [NWRRC 2021] Extreme Problem

· · 题解

如果第一发是 cz 交的话,那我应该就是这题首 A了吧。

进入正题。

发现只有 8 种情况,直接分类讨论完事。

因为是分类讨论的,所以不同情况的思路可能会完全不一致。

No No No & No No Yes

样例给了,如果你想自己构造就自己造吧。

No Yes No

即有多个局部最小值,并且没有平台。

为了没有平台,我们以 t=x-y 作为基数,接着构造一个有最小值的关于 t 的函数即可,因为有多组 x-y=t

随意构造二次函数就行了。

Yes No No

跟上一个一模一样,把二次函数开口朝下就行。

Yes No Yes & No Yes Yes

跟前两个的区别在于要有平台,那么我们直接以前一个的基础上乘上一个 x 即可。

这样就会在 x=0 的时候出现一个 f(x)=0 的平台。

Yes Yes Yes

什么都有。

考虑在一个矩阵里面,有两个最低点,和两个最高点,其他都为 0,所以用 x-ky-k 把最高、最低点围起来即可。

这个可能不太好理解,所以可以看代码。

Yes Yes No

为了没有平台,我们以 t=x-y 作为基数,这一次要有最高、最低点,所以我们用神秘穿针引线法,构造一个有多个拐点的高次函数即可。

这个可能也不太好理解。

code

#include <bits/stdc++.h>
using namespace std;
int main(){
    string s1,s2,s3;
    cin >>s1>>s1>>s1>>s1>>s2>>s2>>s2>>s2>>s3>>s3;
    if(s1=="No"&&s2=="No"&&s3=="No") cout <<"x 3 - 4 ^ y 5 - 2 ^ +";
    else if(s1=="No"&&s2=="No"&&s3=="Yes") cout <<"1";
    else if(s1=="No"&&s2=="Yes"&&s3=="No") cout <<"x y - 2 ^";
    else if(s1=="Yes"&&s2=="No"&&s3=="No") cout <<"0 x y - 2 ^ -";
    else if(s1=="No"&&s2=="Yes"&&s3=="Yes") cout <<"x y - 2 ^ x 2 ^ *";
    else if(s1=="Yes"&&s2=="No"&&s3=="Yes") cout <<"0 x y - 2 ^ x 2 ^ * -";
    else if(s1=="Yes"&&s2=="Yes"&&s3=="Yes") cout <<"x 1 - y 1 - x 3 - 2 ^ y 3 - x 5 - y 5 - * * * * *";
    else if(s1=="Yes"&&s2=="Yes"&&s3=="No") cout <<"x y - 1 - 2 ^ x y - 3 + 2 ^ *";
    return 0;
}

Happy Ending!