cf 2000分乱刷

https://codeforces.com/contest/1796/problem/D

第一次TLE

// https://codeforces.com/contest/1796/problem/D
// utc+8 20230419

#include<bits/stdc++.h>

#define int long long

using namespace std;

void fileio()
{
  //#ifdef LGS
  freopen("in.txt","r",stdin);
  freopen("out.txt","w",stdout);
  //#endif
}

void fileclose()
{
    fclose(stdin);//关闭文件
    fclose(stdout);//关闭文件
}

int gcd(int a,int b)
{
    return b ? gcd(b,a%b) : a;
}

int T;
int n,k,x;
const int N = 2e6 + 10;
int a[N];
int sumak[N];
int dp[N][25];

void solve()
{
   cin >> n >> k >> x;
   int cnt = 0;
   for(int i = 1;i <= n;i ++) cin  >> a[i];

   memset(sumak,0,sizeof sumak);
   memset(dp,-1e9-1,sizeof dp);

   if(x < 0) k = n - k;
   x = x > 0 ? x : -x;
   for(int i = 1;i <= n;i ++) sumak[i] += sumak[i - 1] + a[i];
   for(int i = k;i <= n;i ++) for(int j = 1;j <= k;j ++) dp[i][j] = sumak[i] - sumak[i-j] + j*x;
  
   
   int res = -1e9-1;
   for(int i = k;i <= n;i ++) for(int j = 1;j <= k;j ++)
    res = max(dp[i][j],res);


   for(int i = 1;i < k;i ++) for(int j = 1;j <= i;j ++)
   dp[i][j] = sumak[i] - sumak[i-j] + j * x;

   for(int i = 1;i < k;i ++) for(int j = 1;j <= i;j ++)
    res = max(dp[i][j],res);
 

   //cout << "T: " << T << endl;
  //for(int i = 1;i < k;i ++){ for(int j = 1;j <= i;j ++)
  // cout<< dp[i][j] << ' '; cout <<endl;}
  // for(int i = k;i <= n;i ++){ for(int j = 1;j <= k;j ++)
  // cout<< dp[i][j] << ' '; cout <<endl;}
   

   //for(int i = k;i <= n;i ++)
   //cout << sumak[i] << ' ';
  // cout <<endl;
   
   if(res < 0){
    cout << "0" << endl;
    return;
   }
   
   cout << res << endl;
   return;
}

signed main()
{ 
    fileio();
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> T;
    while(T --) solve();
    fileclose();
}

第二次TLE

// https://codeforces.com/contest/1796/problem/D
// utc+8 20230419

#include<bits/stdc++.h>

#define int long long

using namespace std;
int T;
int n,k,x;
const int N = 2e5 + 10;
int a[N];
int sumak[N];
int dp[N][25];

void solve()
{
   cin >> n >> k >> x;
   int cnt = 0;
   for(int i = 1;i <= n;i ++) cin  >> a[i];
   memset(sumak,0,sizeof sumak);
   memset(dp,-1e9-1,sizeof dp);

   if(x > 0){ 
   //x = x > 0 ? x : -x;
   for(int i = 1;i <= n;i ++) sumak[i] += sumak[i - 1] + a[i];
   for(int i = k;i <= n;i ++) for(int j = 1;j <= k;j ++) dp[i][j] = sumak[i] - sumak[i-j] + j*x;
  
   
   int res = -1e9-1;
   for(int i = k;i <= n;i ++) for(int j = 1;j <= k;j ++)
    res = max(dp[i][j],res);


   for(int i = 1;i < k;i ++) for(int j = 1;j <= i;j ++)
   dp[i][j] = sumak[i] - sumak[i-j] + j * x;

   for(int i = 1;i < k;i ++) for(int j = 1;j <= i;j ++)
    res = max(dp[i][j],res);
   
   if(res < 0){
    cout << "0" << endl;
    return;
   }
   
   cout << res << endl;
   return;
   }
   else
   {  
       memset(dp,0,sizeof dp);
       int ans[26];memset(ans,-1e18,sizeof ans);
      int res = -1e9-1;
       x = -x;
       for(int i = 0;i <= k;i ++)
       for(int j = 1 + i;j <= 1 + i + n - k - 1;j ++)
       {
        dp[j][i] = max(dp[j - 1][i],dp[j][i]) + x + a[j];
        ans[i] = max(a[i],dp[j][i]);
       }
       for(int i = 0;i <= k;i ++)
       res = max(res,ans[i]);

         if(res < 0){
        cout << "0" << endl;
        return;
        }
   
     cout << res << endl;
     return;

   }
}

signed main()
{ 
    //fileio();
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> T;
    while(T --) solve();
   //fileclose();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值