Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

售票厅出售关于音乐会的票,取代原来的卖一张票的形式,而是一组座号连续的票。售票室已经收到很多预订。每个预订包含指定

最小座号的一组连续的票。

售票厅不能满足所有这样的订票。如果出售所有这样的订票,那么将会有大量数目的座号为空。于是售票室作了如下的安排和价

格策略,如果一个订单被接受并且安排了确定的作为,则预定者必须付全部的票的价格(2元)。如果一个订票被接受,但是被安

排的位置与申请的位置不一样(最少有一个位置),那么预定者只需付一半的价格(1元)。

售票室的目标是最大限度增加售票总收入。

【编程任务】

你的任务是编写一个程序,计算出售票厅最大能能获得的收入,并输出对应他们选择的预订中座位的安排方案。

【输入格式】

第一行包含两个整数M 和L。M(1 ≤M≤ 30 000)表示座位的数量,L(1 ≤L≤ 100)表示每组预订中连续座位的数目。座位纺编号从1到M。第二行包含一个整数N,N(1≤N≤100 000)表示预订的数量,第三行包含N个整数,表示预订,其中该行的第i个整数 z(1 ≤z≤ M-L+1),表示第i个预订要求从座位号Z开始,到座位号z+L-1结束。

【输出格式】

输出的第一行包含一个整数S,表示最大的收入,第二行包含一个整数Q,表示被接受的预订数。

【数据规模】

Sample Input1

20 3

7

4 2 10 9 16 15 17

Sample Output1

9

6

【样例说明】

Q行描述座位的分配,每行包含一对整数x y,表示买者x购买从编号y开始的一组票。输出时座位号必须严格递增,可能有多种输出方案。

4 1

1 4

2 7

3 10

6 13

5 16

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

【题解】



设f[i]表示前i个座位能获得的最大利润;

设g[i]表示前i个座位安排了几个人的预定(有可能是随便找个预定放在前面以赚取1元钱);

设h[i]表示前i个座位有多少个预定是随便找一个人预定的(即不是符合它要求的);

再设一个bo[i]表示是否有一个人的预定的连续的座位的最后一个座位在i号座位;

我用程序讲

rep1(i,l,m)//枚举座位
{
if (g[i-l] <n)//如果i-l的位置安排的预定数小于n
{
if (bo[i])//如果有一个预定的连续的座位的最后一个位置在i号
{
f[i] = f[i-l]+2;//则可以安排这个人的需求;
g[i] = g[i-l]+1;//安排的预定数递增
temp[i] = temp[i-l];//这个过程没有增加不符合要求的人
}
else//如果没有人的预定结尾在这里
{
if (f[i]<f[i-l]+1)//就随便找一个人的预定放在这里;
{//如果更优就更新
f[i] = f[i-l]+1;
g[i] = g[i-l]+1;
temp[i] = temp[i-l]+1;//递增随便预定的人的个数
}
}
}
if (bo[i] && g[i-l]==n && temp[i-l]>0)
{//如果有一个人的预定结尾在这里,但是之前的预定已经到达n了,但是前面的座位有一些是随便给的(当前以i结尾的预定肯定也在之前随便给了);
//那么就把那个之前随便给的预定放在这个地方来,这样总的收益就会增1(之前算作没有按照要求的安排已经增加了1);
f[i] = f[i-l]+1;
g[i] = n;//安排的预定数还是不变->这个g数组是用来限制那些随便安排的预定个数的;
temp[i] = temp[i-l]-1;//随便安排的预定个数递减.
} rep1(j,i-l,i-1)//如果不这样循环的话会和程序的预定方案不一样。实际上判断一下f[i-1]是不是大于f[i]就可以了。。看程序吧.
if (f[j]>f[i])
{
f[i] = f[j];
g[i] = g[j];
temp[i] = temp[j];
}

【完整代码】

#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 = 3e4+100;
const int dx[5] = {0,1,-1,0,0};
const int dy[5] = {0,0,0,-1,1};
const double pi = acos(-1.0); int m,l,f[MAXN],g[MAXN],n,temp[MAXN];
bool bo[MAXN] = {0}; int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(m);rei(l);
rei(n);
rep1(i,1,n)
{
int z;
rei(z);
bo[z+l-1] = true;
f[z+l-1] = 2;
g[z+l-1] = 1;
temp[z+l-1] = 0;
}
rep1(i,l,m)
{
if (g[i-l] <n)
{
if (bo[i])
{
f[i] = f[i-l]+2;
g[i] = g[i-l]+1;
temp[i] = temp[i-l];
}
else
{
if (f[i]<f[i-l]+1)
{
f[i] = f[i-l]+1;
g[i] = g[i-l]+1;
temp[i] = temp[i-l]+1;
}
}
}
if (bo[i] && g[i-l]==n && temp[i-l]>0)
{
f[i] = f[i-l]+1;
g[i] = n;
temp[i] = temp[i-l]-1;
} rep1(j,i-l,i-1)
if (f[j]>f[i])
{
f[i] = f[j];
g[i] = g[j];
temp[i] = temp[j];
}
/*if (f[i-1]>f[i]) 这样写也可以,但是得到的方案会和测试点的方案不一样。认为你错了..
{
f[i] = f[i-1];
g[i] = g[i-1];
temp[i] = temp[i-1];
}
*/
}
cout << f[m]<<endl;
cout << g[m]<<endl;
return 0;
}

【u253】售货厅的更多相关文章

  1. 针对电信乌龙事件的深度测试: 广州电信错误将深圳地区189的号码在3G升级4G申请时从广州网厅发货,造成深圳用户收到4G卡后无法激活,深圳电信找不到订单

    广州电信错误将深圳地区189的3G升级4G申请从中国电信广州网厅发货(智能卡号:8986 1114 9002 0851  742X S  电话号码 189),造成用户收到4G卡后无法激活,深圳电信找不 ...

  2. AI 启蒙-无人售货机智能找零算法

    人的理想志向往往和他的能力成正比. --约翰逊--  AI 启蒙-无人售货机智能找零算法  [问题区] 你现在是一家无人售货机生产公司的高级程序员,技术经理叫你实现无人售货机智能找零钱的算法,具体需求 ...

  3. 首家5G体验厅在深圳建成

    日前,深圳移动卓越时代营业厅推出5G全方位体验活动,让市民亲身感受5G时代到来.据悉,十大5G展示项目生动展现移动5G带来的生活巨变与产业升级,为5G发展汇聚各界力量加速创新落地. 现场有市民表示,5 ...

  4. 华为OJ之自动售货系统

    本题主要难点有两部分: 1,找零算法.如何找零应该是最具技巧性的部分,根据已有的硬币金额分布,对应的解决办法可能会有不同.本题中的1,2,5,10这种情况满足贪心性质,故我们简单的用贪心算法的思想来解 ...

  5. 省厅报件7.0 读取mdb 生成xml 文件

    using System;using System.Collections.Generic;using System.Data;using System.Data.OleDb;using System ...

  6. [实验吧](web)因缺思厅的绕过 源码审计绕过

    0x00 直接看源码吧 早上写了个注入fuzz的脚本,无聊回到实验吧的题目进行测试,发现了这道题 地址:http://ctf5.shiyanbar.com/web/pcat/index.php 分析如 ...

  7. utf-8 汉字对照表

    之前从redis中取出一些数据,utf8 16进制编码,想转成字符,没有找到现成的转化工具,先用这个表直接查找对照吧. UTF8编码表大全Code code# Code (coded in UTF-8 ...

  8. thusc2016游记&&滚粗记&&酱油记

    #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/w ...

  9. 2016 Google中国开发者大会游记

    本文地址:http://www.cnblogs.com/likeli/p/6146117.html 写在前面 平时一直埋头写代码,这次既然Google给了门票,也就来看看,看看这种世界顶尖的科技公司, ...

随机推荐

  1. POJ 2376 Cleaning Shifts 区间覆盖问题

    http://poj.org/problem?id=2376 题目大意: 给你一些区间的起点和终点,让你用最小的区间覆盖一个大的区间. 思路: 贪心,按区间的起点找满足条件的并且终点尽量大的. 一开始 ...

  2. 【Codeforces Round #299 (Div. 2) C】 Tavas and Karafs

    [链接] 我是链接,点我呀:) [题意] 给你一个规则,让你知道第i根萝卜的高度为si = A+(i-1)*B 现在给你n个询问; 每次询问给你一个固定的起点l; 让你找一个最大的右端点r; 使得l. ...

  3. 折叠table中的tr

    code <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. poj 3100 (zoj 2818)||ZOJ 2829 ||ZOJ 1938 (poj 2249)

    水题三题: 1.给你B和N,求个整数A使得A^n最接近B 2. 输出第N个能被3或者5整除的数 3.给你整数n和k,让你求组合数c(n,k) 1.poj 3100 (zoj 2818) Root of ...

  5. 新浪sae上安装原生wordpress4.1

    1. 加入/改动wp-config.php文件 <?php /** * WordPress 基础配置文件. * * 本文件包括下面配置选项: MySQL 设置.数据库表名前缀. * 密匙.Wor ...

  6. MongoDB集群安装与配置2.4.3版本

    mongoDB安装http://www.mongodb.org/downloads拷文件到# cp mongodb-linux-i686-2.4.1.tgz /usr/local/进入目录:# cd ...

  7. 读Effective Objective-C [提高OC代码质量总结笔记第一篇:熟悉OC]

    一.OC特性 OC 为 C 语言添加了面向对象特性,是其超集; OC 使用动态绑定的消息结构,也就是,在运行时才会检查对象类型; 接收一条消息后,究竟应执行何种代码,由运行期环境来决定,而非 编译器; ...

  8. [Now] Deploy a Node project with Zeit’s Now

    Use Zeit’s now to deploy a node application from your local machine to a remote cloud service in mom ...

  9. 菜单之二:使用xml文件定义菜单 分类: H1_ANDROID 2013-11-03 09:39 1038人阅读 评论(0) 收藏

    参考<疯狂android讲义>2.10节 P174,参见归档project:XmlMenuDemo.zip 一般推荐使用XML文件定义菜单. 基本步骤如下: 1.定义布局文件 为简单显示原 ...

  10. auto_create_partition

    #!/usr/bin/env python # -*- encoding: utf8 -*- import calendar import time import os import sys from ...