4.5 Daniel13265 的公开赛

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;
}

占个坑,有机会把后面的题补了。 最近打各种比赛也力不从心的,先从补例会的题开始吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值