回档|朴素的网络游戏

描述
佳佳最近又迷上了某款类似于虚拟人生的网络游戏。在游戏中,佳佳是某旅行团的团长,他需要安排客户住进旅馆。旅馆给了佳佳的旅行团一个房间数的限制。每一
个房间有不同的容纳人数和价钱(这个价格是房间的总价格,不是每个人付的)。佳佳决定找到最小的花费,安排参加旅行的人住在这里。但是他遇到了这么一个问
题:两个不同性别的人不能住在同一个房间里,除非他们是夫妻;一对夫妻如果在一起住,那么别的人就不能再住进去。你不必让所有的夫妻都单独住在一起。也就
是说:

1.给你一些房间,告诉你这些房间的容纳人数和价格
2.安排一定数量的人住到旅馆里,满足:
a.不同性别的人如果不是夫妻那么不能住一起。
b.夫妻如果住在一起,那么房间不能安排其他的人进去。
你来写一个程序帮助佳佳找到安排这些来参加旅行的人住进旅馆所需要的最小花费。
格式
输入格式
第一行有4个用空格隔开的整数m,f,r,c,分别表示参加旅行的男性人数、参加旅行的女性人数、旅馆的房间数、这些男女中有多少对夫妻。注意每一个人不是单身就是和他/她唯一的妻子/丈夫一起参加旅行。

接下来有r行,每行描述了一个房间。每行有两个整数Bi,Pi,它们分别表示每一个房子的容纳人数和价格(无论住多少人,房间的价格不变)。

对于30%的数据,0<=m,f,r<=50;
对于100%的数据,0<=m,f,r<=300,0<=c<=Min(m,f),0<=Bi,Pi<=10。

输出格式
输出为旅行的人订购房间所需要的最小花费。如果没有这样的安排,请输出“Impossible”代替。
样例输入
2 1 3 1
3 5
2 10
2 4
样例输出
9
限制
各测试点5秒
OIBH命题组提供 By 月影

解析:dp[l][i][j][k]:l:前l个房间。i:i个男人。j:j个女人。k=0 or
1,表示是否有夫妻。显然夫妻顶多有一对在一间房子里(我觉得不考虑应该也没啥问题),否则不是最优。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;

int m,f,r,c;
int b[500],p[500];
int dp[301][301][301][2];

int main()
{
    cin >> m >> f >> r >> c;
    for (int i=1; i<=r; i++) cin >> b[i] >> p[i];
    memset(dp,127,sizeof(dp));
    int tot=dp[0][0][0][0];
    dp[0][0][0][0]=0;
    for (int l=1; l<=r; l++)
        for (int i=0; i<=m; i++)
            for (int j=0; j<=f; j++)
            {
                if (b[l]>=2 && j>=1 && i>=1) dp[l][i][j][1]=min(dp[l-1][i-1][j-1][0]+p[l],dp[l-1][i][j][1]);
                dp[l][i][j][0]=min(dp[l-1][i][j][0],dp[l][i][j][0]);
                for (int o=1; o<=b[l]; o++)
                {
                    if (i-o>=0)
                    {
                        dp[l][i][j][0]=min(dp[l-1][i-o][j][0]+p[l],dp[l][i][j][0]);
                        dp[l][i][j][1]=min(dp[l-1][i][j][1],dp[l-1][i-o][j][1]+p[l]);
                    }
                    if (j-o>=0)
                    {
                        dp[l][i][j][0]=min(dp[l-1][i][j-o][0]+p[l],dp[l][i][j][0]);
                        dp[l][i][j][1]=min(dp[l-1][i][j-o][1]+p[l],dp[l][i][j][1]);
                    }
                }
            }
    int ans=min(dp[r][m][f][0],dp[r][m][f][1]);
    if (ans==tot) cout << "Impossible" << endl;
      else cout << ans;
    return 0;
}
时间: 2024-10-06 16:09:29

回档|朴素的网络游戏的相关文章

Vijos1240 朴素的网络游戏

思考: 想了很久,感觉这个dp方程没法推导啊. 之后看了看题解才发现原来是自己把自己框在原地了. 首先题目中给了 男生 女生 情侣 房间 花费这几个信息. 看到 房间以及最小花费很容易想到背包 dp[x]...[x]+cost[i]这种的. 男生和女生我们可以看做二维费用背包,但是夫妻这个怎么处理呢. 仔细想想如果有2对夫妻 3对夫妻的情况 我们可不可以看做 2个男一个房 2个女一个房 3个男一个房3个女一个房(这种情况比夫妻住还优)的情况. 也就是可以忽略夫妻这个条件,不过要特判一下夫妻只有一

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

PDMS-DB之配置、回档、合并

DB,即database的简写,是PDMS中数据存储的载体.PDMS中各种各样的三维模型.平面图纸.数据库等等,几乎都存储在DB中.因此一旦DB发生异常,其后果将是毁灭性的,为此我们需要有一些技术手段来处理DB的问题. 1.Reconfigure 重新配置数据库 在使用PDMS的时候,由于网络的异常.操作的异常,也可能是程序本身的异常,使得PDMS非正常关闭.这些情况会导致有影子用户残留在项目中,或者有未正常解除的声明,最极端的会使得某些元素被锁定甚至损坏,使得该DB中数据出现异常. 一般来说,

Unity3D游戏开发之网络游戏服务器架构设计培训(如何做一名好主程)

在我们初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发.后面就应该朝着主程的方面前进 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1.服务器跑在什么样的操作系统环境下?2.采用哪几种语言开发?主要是什么?3.服务器和客户端以什么样的接口通讯?4.采用哪些第三方的类库? 除了技术背

我所理解的网络游戏&lt;一&gt;:网游的顶层设计

网游的基本结构 各大模块的基本功能如下 · 服务器端 登陆服:处理新建玩家.登陆逻辑. 场景服:处理场景服中的逻辑. 中心服:处理跨服的逻辑,实现不同场景服进程的数据调度,以及向数据库查询数据. 数据库前端:定时将这里缓存的数据存入数据库. 服务器管理服:通过配置xml管理多个服务器的启动关闭,作为守护程序定期与所有服务器相连,当不能接受到某个服务器的定期连接时认为该服务器宕机,做相应处理并重启服务器. 运营对接服务器:连接多个服务器,做GM管理,处理来自运营平台的登陆.充值.身份验证. 日志服

Unity3D游戏开发之网络游戏服务器架构设计培训

下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1.服务器跑在什么样的操作系统环境下?2.采用哪几种语言开发?主要是什么?3.服

《机器学习实战》笔记——朴素贝叶斯

运用贝叶斯公式(朴素贝叶斯假设每个特征每个特征都是独立的)可以解决的问题有,已知某些特征,用来判断某情况发生的可能性大小,设置可能性最大的情况作为预测值. 是一种监督算法. 广泛应用于垃圾邮件检测等等. 1 # _*_coding:utf-8_*_ 2 from numpy import * 3 4 # 4-1 词表到向量的转换函数(实验样本) 5 def loadDataSet(): 6 postingList = [['my', 'dog', 'has', 'flea', 'problems

朴素和KMP模式匹配算法(Java)

朴素模式匹配算法 public class Test { //朴素模式匹配算法 public int Index(String s,String t,int pos){ int i = pos;//主串中第几个位置开始比较 int j = 0;//模式串中的第一个位置 while(i<s.length()&&j<t.length()){ if(s.charAt(i)==t.charAt(j)){ i++; j++; }else { i = i-j+1;//主串的下一个位置 j

Unity3d使用蓝牙(bluetooth)开发IOS点对点网络游戏

著作权声明:本文由http://www.cnblogs.com/icker 原创,欢迎转载分享.转载时请保留该声明和作者博客链接,谢谢! 最近使用Unity3d制作的IOS游戏需要加入联网对战功能功能,因此使用ObjC语言利用IOS SDK的GameKit.framework的Peer-to-peer Connectivity实现了网络连接,在此分享. 啥话都不说,先上代码.点我下载工程文件, 类NetWorkP2P,继承自NSObject.提供GKSessionDelegate和GKPeerP