设使用了x个"qcjjkkt"和y个"td"则总长度约束为:7x+2y-min(x,y)≤n(减去 min(x, y) 是因为有 min(x, y) 个 "td" 可以节省一个字符)。最优解一定出现在几个关键点附近:
1.x=0(完全不使用 "qcjjkkt")
2.x=n/7(最大可能的 "qcjjkkt" 数量)
3.x=n/8(平衡点)
4.在这些点附近 ±1 的位置(防止遗漏边界情况)
对以上点进行检查即可。
附本人ac码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define mod 998244353
const ll N=1e6+10;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin>>t;
while(t--)
{
ll n,a,b;
cin>>n>>a>>b;
vector<ll>x;
x.push_back(0);// 完全不使用qcjjkkt
x.push_back(n / 7);// 最大可能数量
x.push_back(n / 8);// 平衡点
x.push_back(n / 8 - 1);// 平衡点左侧
x.push_back(n / 8 + 1);// 平衡点右侧
x.push_back(n / 7 - 1);// 最大值左侧
x.push_back(n / 7 + 1);// 最大值右侧
ll m=0;
for (ll i:x)
{
if (i<0||7*i>n)continue;
ll rest=n-7*i;// 剩余可用长度
ll free=min(i,rest);// 能免费添加的'd'数量
ll normal= (rest-free)/2;// 正常构造的td数量
ll sum=free+normal;// 总td数量
ll score=a*i+b*sum; // 目标函数值
m= max(m, score);
}
cout<<m<<endl;
}
return 0;
}

京公网安备 11010502036488号