狩猎大赛(社团周赛)

Posted yokel062

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了狩猎大赛(社团周赛)相关的知识,希望对你有一定的参考价值。

链接:http://139.9.84.16/problem/1006

Description

肥宅和他的老婆们最近沉迷《人被怪物猎:世界》,现在他们正在准备举行狩猎大赛!

狩猎大赛只允许使用太刀和弓箭两种武器,两种武器分别放在两个仓库。狩猎需要先排队在仓库里挑选一把满意的太刀或者满意的弓,然后开始狩猎。

有很多台电脑,因此老婆们挑好武器之后都能够开始狩猎,但每个仓库里最多同时只能有一个人进入。

肥宅想将老婆们分成两队并安排好排队顺序。两个队伍是并行的互不影响。

对于肥宅的第iii老婆,不管使用什么武器,挑武器都是需要XiX_iXi?时间,狩猎都是需要YiY_iYi?时间。

从时刻000开始计算,请问老婆们最快在什么时刻完成狩猎?

 

Input

第一行一个正整数nnn表示有nnn个老婆

接下来nnn行,每行两个整数分别表示XiX_iXi?YiY_iYi?

1&lt;n≤3001 &lt; n \leq 3001<n300

2≤Xi,Yi≤2332 \leq X_i,Y_i \leq 2332Xi?,Yi?233

 

Output

输出一行一个整数表示最快在何时完成所有狩猎

Sample Input 1

5
2 2
7 7
1 3
6 4
8 5

Sample Output 1

17

 

题解:很显然y大的放在队头,注意xi,yi的数值都很小,总时间就很小,因为是2个队列,只要对其中的一个队进行dp就能知道总的最优解,f[i][j]表示前i个,在第j秒时的最优解,

  状态转移方程:f[i][j]=min( max(f[i-1][j-xi], j+yi)); f[i][j]=min( max(f[i-1][j], sum[i]-j+yi));

技术图片
#include <bits/stdc++.h>
using namespace std;

const int maxn=305;
struct Node
    int x, y;
    bool operator <(const Node &a) const
        return y>a.y;
    
a[maxn];

int f[maxn][maxn*maxn], sum[maxn];
int n;

int main()

    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        scanf("%d%d", &a[i].x, &a[i].y);
    sort(a+1, a+1+n);
    for(int i=1; i<=n; i++)
        sum[i]=sum[i-1]+a[i].x;
    memset(f, 0x3f, sizeof(f));
    f[0][0]=0;
    for(int i=1; i<=n; i++)
    
        for(int j=a[i].x; j<=sum[n]; j++)
            f[i][j]=min(f[i][j], max(f[i-1][j-a[i].x], j+a[i].y));
        for(int j=0; j<=sum[n]; j++)
            f[i][j]=min(f[i][j], max(f[i-1][j], sum[i]-j+a[i].y));
    
    int ans=1<<30;
    for(int j=0; j<=sum[n]; j++)
        ans=min(ans, f[n][j]);
    printf("%d\n", ans);
    return 0;
View Code

 

 

以上是关于狩猎大赛(社团周赛)的主要内容,如果未能解决你的问题,请参考以下文章

自动驾驶社团招新啦!!!!!

小学二年级汉字听写大赛题库

2021山东省大学生网络技术大赛网络安全赛道决赛WP

leetcode周赛有证书吗

最新创业大赛×××?最新创业大赛有哪些?

创业者参加创业大赛能获得哪些创业资源?最新创业大赛有哪些?