【计蒜客——复赛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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wuliwuliii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值