[ABC268F] Best Concatenation 题解
首先,我们定义一个函数
其次,本题的得分计算有一个性质:
对于字符串
::::info[证明]
定义
记 X 的数量,
根据定义容易得到
进一步地,根据上面的证明,发现对于 std::sort,按这个方法排个序再连接起来计算答案就行。
放代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin>>n;
vector<string> s(n);
for(auto &i:s)cin>>i;
vector<int> x(n),y(n),p(n);
for(int i=0;i<n;i++)
for(char j:s[i])j=='X'?x[i]++:y[i]+=j-48;
iota(p.begin(),p.end(),0);
sort(p.begin(),p.end(),[&](int a,int b){
return x[a]*y[b]>y[a]*x[b];
}); // 按照上面所述的方法排序
string g;
for(int i:p)g+=s[i]; // 连接
int cx=0,c=0;
for(char i:g)i=='X'?cx++:c+=cx*(i-48); // 模拟题意计算答案
cout<<c<<endl;
return 0;
}