题意:对于结构“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+b与bc+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; }