我是把他们的公约数求出来,然后求28个td的分数,7个qsjjkktd,8个qsjjkkt,比较分数大小,有人可能觉得这样比较是不是有点草率,其实从数学是,比较的是td,qsjjkkt等模式下,每个英文字母的平均得分,所以其实很合理,然后就是动态规划,要多抽出来56个字符,因为最后一段有可能会有遗漏的几块,不能拼的很完美,如果是重复的周期性的话,一定是一样的最大,最赚,但是现在要多考虑这种情况,因为确实举例子的话是可能出现这种情况的
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=113;
ll dp[N];
ll c(int m,ll a,ll b){
for(int i=1;i<=m;i++){
dp[i]=dp[i-1];
if(i>=2)dp[i]=max(dp[i],dp[i-2]+b);
if(i>=7)dp[i]=max(dp[i],dp[i-7]+a);
if(i>=8)dp[i]=max(dp[i],dp[i-8]+a+b);
}
return dp[m];
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;
cin>>T;
while(T--){
ll n,a,b;
cin>>n>>a>>b;
ll max1=max({8*a,28*b,7*(a+b)});
ll m=n%56;
ll p=m+56;
ll ans=0;
if(n>=56){
ans+=(n-p)/56*max1;
ans+=c(p,a,b);
}else{
ans+=c(n,a,b);
}
cout<<ans<<'\n';
}
return 0;
}

京公网安备 11010502036488号