zoukankan      html  css  js  c++  java
  • 【t057】任务分配

    Time Limit: 1 second
    Memory Limit: 128 MB

    【问题描述】

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

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

    【输出格式】

    一个数,他们完成所有的任务至少要的时间。
    【输入输出样例解释】
    A完成任务1和任务2,时间为11。B完成任务3,时间为12。
    或者 A完成任务1和任务3,时间为12。B完成任务2,时间为11。
    【限制】
    30%的数据满足:1 <= n <= 20
    100%的数据满足:1 <= n <= 200 , 1 <= ai,bi <=200
    Sample Input

    3
    5 10
    6 11
    7 12

    Sample Output

    12

    【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t057

    【题解】

    设f[i][j]表示前i个任务,a机器花了j时间,b机器花的时间的最小值;
    即f[i][j]表示的是B机器花了多少时间;

    f[i][j] = min(f[i-1][j]+b[i],f[i-1][j-a[i]]);
    其中前一个表示第i个任务用b机器搞,后一个表示用a机器搞;
    比较奇葩的状态转移方程.

    【完整代码】

    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <set>
    #include <map>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <stack>
    #include <string>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    void rel(LL &r)
    {
        r = 0;
        char t = getchar();
        while (!isdigit(t) && t!='-') t = getchar();
        LL sign = 1;
        if (t == '-')sign = -1;
        while (!isdigit(t)) t = getchar();
        while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
        r = r*sign;
    }
    
    void rei(int &r)
    {
        r = 0;
        char t = getchar();
        while (!isdigit(t)&&t!='-') t = getchar();
        int sign = 1;
        if (t == '-')sign = -1;
        while (!isdigit(t)) t = getchar();
        while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
        r = r*sign;
    }
    
    const int MAXN = 200+10;
    const int INF = 0x3f3f3f3f;
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    
    int f[MAXN][MAXN*MAXN];
    int n;
    int a[MAXN],b[MAXN];
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        rei(n);
        rep1(i,1,n)
            rei(a[i]),rei(b[i]);
        memset(f,INF,sizeof f);
        f[0][0] = 0;
        int now = 0;
        rep1(i,1,n)
        {
            now += a[i];
            rep1(j,0,now)
            {
                if (f[i-1][j]+b[i]<f[i][j])
                    f[i][j] = f[i-1][j]+b[i];
                if (j>=a[i])
                    if (f[i][j]>f[i-1][j-a[i]])
                        f[i][j] = f[i-1][j-a[i]];
            }
        }
        int ans = INF;
        rep1(i,0,now)
            ans = min(ans,max(i,f[n][i]));
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626860.html
Copyright © 2011-2022 走看看