zoukankan      html  css  js  c++  java
  • 【noip模拟赛5】任务分配 降维dp

      

    描述

     

    现有n个任务,要交给A和B完成。每个任务给A或给B完成,所需的时间分别为ai和bi。问他们完成所有的任务至少要多少时间。

    输入

     

    第一行一个正整数n,表示有n个任务。接下来有n行,每行两个正整数ai,bi。

    输出

     

    一个数,他们完成所有的任务至少要的时间。

    输入样例 1 

    3
    5 10
    6 11
    7 12

    输出样例 1

    12

    提示

    【输入输出样例解释】

    A完成任务1和任务2,时间为11。B完成任务3,时间为12。

    或者A完成任务1和任务3,时间为12。B完成任务2,时间为11。

    一看题目感觉很简单

    最普通的写法就是三维的  然后用背包写法     但是会 超时 

    可以进行降维处理!!

    dp[i][j]表示  第i项任务   a的时间是j  b的时间是dp!!!  太强大了QAQ

    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 10005
    int a[N];
    int b[N];
    int dp[N][N];
    int main()
    {
        int n;
        RI(n);
        rep(i,1,n)
        RII(a[i],b[i]);
        long sum=0;
        rep(i,1,n)
        {
            sum+=a[i];
            rep(j,0,sum)
            {
                dp[i][j]=dp[i-1][j]+b[i];//先让b来做试试
                if(j>=a[i])dp[i][j]=min(dp[i][j],dp[i-1][j-a[i]]);//再加上a来比对  哪个时间短
            }
        }
        int minn=0x3f3f3f3f;
        rep(i,0,sum)
        minn=min(minn,max(i,dp[n][i]));//注意求极值的写法
        cout<<minn;
    }

      

  • 相关阅读:
    SQL 联合语句
    Strust2MVC
    struts2执行流程
    struts2的验证框架
    poj 1201 Intervals
    FZOJ Problem 2219 StarCraft
    poj 3470 Walls
    hdu 6021 MG loves string
    FZOJ Problem 2150 Fire Game
    FZOJ Problem 2148 Moon Game
  • 原文地址:https://www.cnblogs.com/bxd123/p/10555282.html
Copyright © 2011-2022 走看看