被鴿了的文件清除

連接:https://ac.nowcoder.com/acm/contest/1091/D
來源:牛客網

html

時間限制:C/C++ 1秒,其餘語言2秒
空間限制:C/C++ 524288K,其餘語言1048576K
64bit IO Format: %lld

題目描述

衆所周知,你成天瀏覽一些網站有時候由於你手賤,有些奇奇怪怪的東西不知不覺開始下載, 而你通常會馬上點掉他們, 可是卻由於你很懶沒有把殘留文件刪掉

衆所周知,時間久了,由於沒有刪掉殘留文件你手機的內存會愈來愈少。

如今你的手機內存已經枯竭, 你要去外太空找新能源(走錯了)

如今你要開始清除殘留的n個文件。

清除的方式有2種:

1.手動刪除;
2.軟件刪除

可是你很懶,你今天至多手動刪除x個文件。

手動刪除必須知足上一次是軟件刪除,而軟件刪除沒有要求。

第i個文件,手動刪除擴充 aia_iai單位的內存,軟件刪除擴充bib_ibi單位的內存

如今你想知道你今天最多擴出多少內存來

輸入描述:

一行一個整數n,x 表示一共有n個文件,至多手動刪x個文件
接下來n行,每行兩個整數a,b 表示手動刪除擴充a單位的內存,軟件刪除擴充b單位的內存

輸出描述:

一行一個整數表示最多擴充多少內存
示例1

輸入

複製
4 1
1 1
2 1
3 2
4 3

輸出

複製
8

說明

一次機會

若是手動刪除1,答案是 1 + 1 + 2 + 3 = 7

若是手動刪除2,答案是 1 + 2 + 2 + 3 = 8

若是手動刪除3,答案是 1 + 1 + 3 + 3 = 8

若是手動刪除4,答案是 1 + 1 + 2 + 4 = 8

備註:

對於30%30\%30%的數據,知足1≤n,x≤101\leq n,x\leq101n,x10

對於另外30%30\%30%的數據,知足1≤n≤105,x=01\leq n\leq 10^5,x = 01n105,x=0
 
對於 100%100\%100%的數據,知足1≤ai,bi≤1091\leq a_i,b_i\leq10^91ai,bi109
 
對於100%100\%100%的數據,知足1≤n≤105,1≤x≤min⁡{n,103}1\leq n\leq10^5,1\leq x\leq\min\{n,10^3\}1n105,1xmin{n,103}
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn=1e5+10;

int n,x;
ll s[maxn],t[maxn];
ll dp[3][maxn][3];

int main()
{
    scanf("%d%d",&n,&x);
    for(register int i=1;i<=n;++i){
        scanf("%lld%lld",&s[i],&t[i]);
    }

    for(register int i=1;i<=n;++i){
        dp[i&1][0][0]=dp[(i-1)&1][0][0]+t[i];
        for(register int j=1;j<=min(x,i-1);++j){
            dp[i&1][j][0]=max(dp[(i-1)&1][j][0],dp[(i-1)&1][j][1])+t[i];
            dp[(i&1)][j][1]=dp[(i-1)&1][j-1][0]+s[i];
        }
    }
    ll res=0;

    for(register int i=0;i<=x;++i){
        res=max(res,dp[n&1][i][0]);
        res=max(res,dp[(n&1)][i][1]);
    }
    printf("%lld\n",res);
    return 0;
}
相關文章
相關標籤/搜索