【计蒜客——复赛A题】贝壳找房函数最值

 题意:对于结构“f(x)=ax+b”这样的一次函数,我们要做的就是,对“fi(fj(x))=ai(ajx+bj)+bi”这样的可换序嵌套函数求它的最大值f(f(f(......f(x))....)))。

接下来先分享一下令我忧伤的WA让大家快乐一下......

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int T;
int n,x;
struct node
{
    int a,b;
}k[10005];
bool cmp(node exp1, node exp2)
{
    return exp1.a==exp2.a?(exp1.b>exp2.b):(exp1.a<exp2.a);
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&x);
        for(int i=0; i<n; i++)
        {
            scanf("%d",&k[i].a);
        }
        for(int i=0; i<n; i++)
        {
            scanf("%d",&k[i].b);
        }
        sort(k, k+n, cmp);
        x%=10;
        for(int i=0; i<n; i++)
        {
            x=(k[i].a*x+k[i].b)%10;
        }
        printf("%d\n",x);
    }
    return 0;
}

    错解思路很清晰,测试样例也都对,但是还就是WA,原因在于,还是没读懂题意,我每次找的都是把倍数最低的放在最前面,然后如果倍数相等,将b大的放在前面,但是显然与题意不符。

    正解我们思考两个f的情况ax+b与cx+d,如此,有两种嵌套方式,分别为:a*(c*x+d)+b 与 c*(a*x+b)+d ,我们比较这两种嵌套方式的不同,总结得:a*(c*x+d)+b=ac*x+ad+b ; c*(a*x+b)+d=ac*x+bc+d,那么如果嵌套函数ff取第一式比较大的话,则ad+b>bc+d。说明第一式与第二式的不同不在于系数而在于ad+bbc+d的大小,即,我们可以根据ai*bj+bi的大小对全体f进行排序。
代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int T;
int n,x;
struct node
{
    int a,b;
    friend bool operator<(node exp1, node exp2)
    {
        if(exp1.a*exp2.b+exp1.b>exp2.a*exp1.b+exp2.b)
        {
            return true;
        }
        else return false;
    }
}k[10005];
priority_queue<node>Q;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        while(!Q.empty())
        {
            Q.pop();
        }
        scanf("%d%d",&n,&x);
        for(int i=0; i<n; i++)
        {
            scanf("%d",&k[i].a);
        }
        for(int i=0; i<n; i++)
        {
            scanf("%d",&k[i].b);
        }
        for(int i=0; i<n; i++)
        {
            Q.push(k[i]);
        }
        x%=10;
        for(int i=0; i<n; i++)
        {
            node now;
            now=Q.top();
            Q.pop();
            x=(now.a*x+now.b)%10;
        }
        printf("%d\n",x);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41730082/article/details/80724298
今日推荐