目录
G.Maximize the Remaining String
A.Strange Table
题意:给出n,m,x,表示nm矩阵,输出以按列排列 的矩阵中 数x 的位置 的按行排列的值
输入 3 5 11
输出 9
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=1e6+10;
int main() {
int t;
cin>>t;
ll n,m,x;
while(t--) {
ll ans=0;
cin>>n>>m>>x;
ll x1=(x+n-1)/n;///column
ll x2=x%n;///row
// cout<<x1<<" "<<x2<<"++"<<endl;
if(x2==0) x2=n;
ans=x2*m-(m-x1);
cout<<ans<<endl;
}
return 0;
}
B.Partial Replacement
题意:t组样例,每组给出n,k,接着一行长度为n的字符串(仅由 . * 组成), 把第一个为 星号的字符变成x,最后一个 星号 也变成x, 修改一次代价为1, 要求两个x不能大于k, 问最小的 星号 改成x 的代价
分析:先找出第一个星号和最后一个星号的坐标(必须修改成x),然后把所有星号都改成x,最后把不必要的修改再减掉,具体操作就是 ---- 尽量拉开两个x字符的距离,比如第temp位置是修改成x字符的,然后在[temp~temp+k]范围内,找到离temp最远的一个 星号 修改为x,然后区间内的就不用修改...
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=1e6+10;
int main() {
int t;
cin>>t;
while(t--) {
int n,k;
cin>>n>>k;
string s;
cin>>s;
int ans=0,flag=0,flagn=0;
for(int i=0; i<n; i++) {
if(s[i]=='*') {
s[i]='x';
++ans;
flag=i;
flagn=i;
break;
}
}
for(int i=n-1; i>=0; i--) {
if(s[i]=='*') {
s[i]='x';
++ans;
flagn=i;
break;
}
}
for(int i=0; i<n; i++) {
if(s[i]=='*') {
s[i]='x';
++ans;
}
}
// cout<<"+++"<<flag<<"++"<<flagn<<endl;
while(flag!=flagn) {
int cnt=0;
int temp=flag;
for(int j=temp+1; j<=temp+k&&j<n; j++) {
if(s[j]=='x')
flag=j,++cnt;
}
// cout<<"++"<<flag<<endl;
ans-=cnt-1;
}
cout<<ans<<endl;
}
return 0;
}
C.Double-ended Strings
题意:t组,每组两个字符串,修改每一个串,通过只能前面删除一个字符或者后面删除一个字符,使得两个串相等,问最少操作次数
分析:找到两个串的最长公共子序列,然后两个串的长度-2*LCS(Longest Common Subsequence)
Code:
#include<bits/stdc++.h>
using namespace std;
#define long long ll
const int maxn=1e3+10;
#define mem(a,b) memset(a,b,sizeof(a))
int dp[maxn][maxn];
int main() {
int t;
cin>>t;
while(t--) {
string str1,str2;
cin>>str1>>str2;
int ans=0;
mem(dp,0);
for(int i=0; i<str1.size(); ++i) {
for(int j=0; j<str2.size(); ++j) {
if(str1[i]==str2[j]) {
if(i==0||j==0)dp[i][j]=1;
else dp[i][j]=dp[i-1][j-1]+1;
}
}
}
for(int i=0; i<str1.size(); ++i) {
for(int j=0; j<str2.size(); ++j) {
ans=max(ans,dp[i][j]);
}
}
cout<<str1.size()+str2.size()-2*ans<<endl;
}
return 0;
}
D.Epic Transformation
题意:
分析:
Code:
E.Restoring the Permutation
题意:
分析:
Code:
F.Triangular Paths
题意:
分析:
Code:
G.Maximize the Remaining String
题意:
分析:
Code: