4.5 Daniel13265 的公开赛
4.5 牛客公开赛题解(未完结)
1.替换
官方题解
戳这里
居然没有官方代码
暴力做法:分奇偶形式的对称数列,1e3数据 n2搞定,但是wa了…不知道为啥qwq
#include <iostream>
#include <cstdio>
#include <cmath>
const int mod = 1e9+7;
using namespace std;
int a[1005];
double b[1005],sum[1005]={0};
int main(){
int n,k;
int i;
int pl,pr;
cin >> n >> k;
int ans = 0;
int l ,r ,cnt ;
for( i = 1;i <= n;i++){
cin >> a[i];
b[i] = log(a[i]);
sum[i] = sum[i-1]+b[i];
}
// for(int i = 1;i <= n;i++){
// cout << sum[i] << endl;
// }
for( i = 1;i <= n;i++){
l = i,r = i,cnt = k;
while(l >= 1&&r <= n){
if(a[l]!=a[r]){
if(cnt) cnt--;
else {
l++;
r--;
break;
}
}
l--;
r++;
}
if(sum[r]-sum[l-1]>ans){
ans = sum[r]-sum[l-1];
pl = l,pr = r;
/// cout << pl << " 111 " << pr << endl;
}
l = i,r = i+1,cnt = k;
while(l >= 1&&r <= n){
if(a[l]!=a[r]){
if(cnt) cnt--;
else {
l++;
r--;
break;
}
}
l--;
r++;
}
if(sum[r]-sum[l-1]>ans){
ans = sum[r]-sum[l-1];
pl = l,pr = r;
}
}
long long res = 1;
cout << pl << pr << endl;
for(i = pl;i <= pr;i++){
res=(res*a[i])%mod;
}
cout << res << endl;
return 0;
}
学长用区间dp写的ac代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define sci(x) scanf("%d",&(x))
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
const int N=1e3+10,M=2e3+10,INF=0x3f3f3f3f,mod=1e9+7;//998244353
int n,k,dp[N][N],a[N],pl,pr;
double b[N],sum[N],ans;
bool upd(double &x,double y){
if(x<y){
x=y;
return 1;
}
return 0;
}
int main(){
sci(n),sci(k);
rep(i,1,n){
sci(a[i]);
b[i]=log(a[i]);
sum[i]=sum[i-1]+b[i];
dp[i][i]=0;
if(i>1){
if(a[i-1]==a[i])dp[i-1][i]=0;
else dp[i-1][i]=1;
}
}
rep(len,3,n){
rep(l,1,n+1-len){
int r=l+len-1;
dp[l][r]=dp[l+1][r-1]+(a[l]!=a[r]);
}
}
rep(l,1,n){
rep(r,l,n){
if(dp[l][r]<=k){
if(upd(ans,sum[r]-sum[l-1])){
pl=l,pr=r;
}
}
}
}
ll res=1;
rep(i,pl,pr){
res=(res*a[i])%mod;
}
printf("%lld\n",res);
return 0;
}
占个坑,有机会把后面的题补了。 最近打各种比赛也力不从心的,先从补例会的题开始吧