[洛谷P2113] 看球泡妹子

洛谷题目链接:看球泡妹子

题目背景

2014年巴西世界杯开幕了,现在满城皆是世界杯,商家们利用它大赚一笔,小明和小红也借此机会增进感情。

题目描述

本届世界杯共有N支球队,M场比赛。男球迷小明喜欢看比赛,女球迷小红喜欢看帅哥。每支球队在小明眼里的实力值为Ai,在小红眼里的帅哥数量为Bi。

每场比赛有两个球队对抗,它们的编号分别是Pi和Qi。小明认为一场比赛的精彩度等于两队实力的乘积,小红则认为是两队帅哥数量之和。

由于体力的限制,他们最多只能看K场比赛。当然,只要看比赛,两个人一定会一起看。小明作为男生,理应迁就一下女生,所以,请你写一个程序,求出小红看到比赛的精彩度总和不小于C的情况下,小明看到比赛的精彩度的最大总和。

输入输出格式

输入格式:

第1行,4个正整数N,M,K,C。

第2行,N个空格隔开的正整数Ai。

第3行,N个空格隔开的正整数Bi。

之后M行,每行两个正整数Pi,Qi。

输出格式:

一行,一个正整数表示小明看到比赛的精彩度的最大总和。如果无论如何都无法满足小红的要求,输出-1.

输入输出样例

输入样例#1:

4 3 2 5
2 2 1 3
1 1 1 2
1 2
2 3
3 4

输出样例#1:

7

说明

对于20%数据,N,M,K<=5。

对于全部数据,N<=100,K<=M<=100,Ai,Bi<=10,C<=1000.

一句话题意: n个队伍间有比赛, A,B两个参数描述队伍,有m场比赛,看一场\(x\)和\(y\)的比赛小明可以获得\(A_x*A_y\)的精彩度,小红可以获得\(B_x+B_y\)的精彩度. 问看k场的情况下,要使小红得到的精彩度大于c,小明可以得到的最大精彩度是多少.

题解: 因为\(B_x+B_y\)并不大,最多也只有2000,所以可以考虑用DP将小红得到的精彩度作为背包的费用存下来,那么选k场也就可以看成是一个01背包.那么可以定义状态\(f[i][j][k]\)表示选到了第\(j\)场比赛,看了\(i\)场,小红得到的精彩度为\(k\). 可以得到状态转移方程:
\[f[i][j][k] = max(f[i-1][j-1][k-v]+w, f[i][j][k])\]
其中k为枚举的精彩度,v为看这次比赛小红可以得到的精彩度,w为小明可以得到的精彩度.

然后注意一下赋初始值的问题就可以了.

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int N=100+5;

int n, m, k, c, ans = -1;
int f[N][N][2000+5];
//in the front i_th games
//watched j games
//the level of the game is l

struct team{
    int a, b;
}t[N];

struct game{
    int x, y, v, w;
}g[N];

int main(){
    //freopen("data.in","r",stdin);
    cin >> n >> m >> k >> c;
    memset(f,128,sizeof(f)); f[0][0][0] = 0;
    for(int i=1;i<=m;i++) f[i][0][0] = 0;
    for(int i=1;i<=n;i++) cin >> t[i].a;
    for(int i=1;i<=n;i++) cin >> t[i].b;
    for(int i=1;i<=m;i++){
        cin >> g[i].x >> g[i].y;
        g[i].w = t[g[i].x].a*t[g[i].y].a;
        g[i].v = t[g[i].x].b+t[g[i].y].b;
    }
    for(int i=1;i<=k;i++)//the chances to see the game
    for(int j=i;j<=m;j++)//game
        for(int l=2000;l>=0;l--){//the level of the game
        f[j][i][l] = max(f[j][i][l], f[j-1][i][l]);
        if(l >= g[j].v) f[j][i][l] = max(f[j][i][l], f[j-1][i-1][l-g[j].v]+g[j].w);
        if(l >= c) ans = max(ans, f[j][i][l]);
    }
    printf("%d\n",ans);
    return 0;
}

状态定义的比较奇葩不要见怪哈..

原文地址:https://www.cnblogs.com/BCOI/p/9028534.html

时间: 2024-11-12 14:39:22

[洛谷P2113] 看球泡妹子的相关文章

洛谷 2113 看球泡妹子

2333 这么水的蓝题 球啊,你呀,n**ve 做法 f[i][j] 表示看了i场比赛,小♀红的什么东西为j时小♂明的什么值 强行压维蛤蛤 剩下的转移很简单(注意i的循环顺序从后往前,01背包) (具体见代码) code #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<queue>

(luogu P2113) 看球泡妹子

(luogu P2113) 看球泡妹子 题目链接 https://www.luogu.org/problemnew/show/P2113 题解 几个月前尝试过的题..现在终于a了 其实巨尼玛简单 就是一个01背包而且物品只能选k次 那么就再加一维不就行了 代码 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector>

洛谷2765 魔术球问题

题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11 个球. «编程任务: 对于给定的n,计算在n根柱子上最多能放多少个球. 输入输出格式 输入格式: 第1 行有1个正整数n,表示柱子数. 输出格式: 程序运行结束时,将n 根柱子上最多能放的球数以及相应的放

看球需谨慎:男友们警惕妹子们的9句话!

世界杯揭幕了,有些汉子痴迷于看球冷落了女朋友,丝毫没有意识到女朋友怒了.汉子们,如果你的女朋友说了以下9句话,你可是要警惕了!如果她说“没事”,你可能就摊上大事了!! The other day a friend told me his girlfriend was being very quiet. He asked her what was wrong and she said “nothing.” He said he wasn’t worried. I had to show him t

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不

洛谷 P3227 BZOJ 3144 [HNOI2013]切糕

题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案. 出于简便考虑,我们将切糕视作一个长 P.宽 Q.高 R 的长方体点阵.我们将位于第 z层中第 x 行.第 y 列上(1≤x≤P, 1≤y≤Q, 1≤z≤R)的点称为(x,y,z),它有一个非负的不和谐值 v(x,y,z).一个合法的切面满足以下两个条件: 与每个纵轴(一共有 P*Q 个纵轴)有且

洛谷P1083 借教室 二分 + 差分

洛谷P1083 借教室 二分 + 差分(或说前缀和,其实前缀和更准确一点) 首先二分答案,即取 mid 个人,且他们不会冲突 然后O(n) 判断是否冲突 如何判断呢,首先我们发现 一个人的操作相当于是将 一些连续的山削去了一个高度 然后我们可以记录这座山被消了多少高度,但这样一次就要 O(N) 总共(n^2) 但是我们发现高度差只有两个地方变了,一个是起始,一个是终止 t[ i ] 表示 h[ i ] - h[ i-1 ] 改变过后 于是 t[ s ]-=d,t[ t+1 ]+=d ; 然后这样