ACM 任务

ACM 任务
区间dp,滚动优化
枚举大学的先后顺序,分配前j个任务给前两所大学,考虑最优分配,维护二者共同构成的最优前缀,后缀始终是个定值。

code:

#include <bits/stdc++.h>

using namespace std;

int pos[3][150005] ;
int pre[3][150005] ;
int a[3][150005] ;

void getPos(int n , int idx){
    for(int i = n ; i >= 1 ; i--) pos[idx][i] = pos[idx][i+1] + a[idx][i];
}
void getPre(int n , int idx){
    for(int i = 1 ; i <= n ; i++) pre[idx][i] = pre[idx][i-1] + a[idx][i];
}
int solve(int x ,int y ,int z , int n){
    int pp = a[x][1] + a[y][2] ;
    int ans = pp + pos[z][3] ;
    for(int j = 3 ; j + 1<= n ; j++){
        pp = min(pp+a[y][j],pre[x][j-1]+a[y][j]);
        ans = min(ans,pp+pos[z][j+1]);
    }
    return ans ;
}
int main(){
    //freopen("in","r",stdin);
    int n ;
    scanf("%d",&n);
    for(int i = 0 ; i < 3 ; i++){
        for(int j = 1 ; j <= n ; j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i = 0 ; i < 3 ; i++) {
        getPos(n,i);
        getPre(n,i);
    }
    int ans = INT_MAX ;
    int Order[3] = {0,1,2};
    do{
        int x = Order[0] , y = Order[1] , z = Order[2] ;
        ans = min(ans, solve(x,y,z,n)) ;
    } while (next_permutation(Order,Order+3));
    cout << ans << endl ;
    return 0 ;
}
上一篇:ACM必备模板——动态规划


下一篇:2021-2022-1 BUCT ACM集训队每周程序设计竞赛(8) - 问题D :一月忘干净