POJ-2726-Holiday Hotel
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 8302 | Accepted: 3249 |
Description
- Any hotel which is closer to the seashore than M will be more expensive than M.
- Any hotel which is cheaper than M will be farther away from the seashore than M.
Input
Output
Sample Input
Sample Output
-------------------------------------------------
分析:这道题折腾了我一晚上也没AC,直到第二天早上起来才恍然大悟,心里暗骂出题人100遍,网上有人说貌似是楼教主出的,好吧我承认一开始我对题的理解有问题。首先,这道题的模型很简单,即任何比M旅店离海边近的旅店都比M酒店要贵,至于第二个条件,其实就是第一个条件的逆否命题,用来迷惑你的,嘿嘿!现在的关键是我们如何理解这个条件并把它转化为数学语言,你可能二话不说直接写出了这个数学形式的逻辑语句:∀i,if Di<DM ⇒ Ci>CM ,能写出来这个,证明你高一数学学的很好,跟我一样好。但是我们都犯了一个错误,那就是没有结合题意去讨论特殊情形。首先,我们看一下样例输入,发现有两个旅店距离海边都为100,它们同是离海边最近的旅店,但是它们的价格是不一样的,Smith夫妇选旅店会把它们两个同时作为候选项吗?显然不会!距离相同时,它们当然只会把更便宜的作为候选项,贵的那个直接抛弃!而对于我们之前写的表达式,显然它们两个是都满足的,原因是我们并没有考虑到距离相同时的情形,当然如果出题人好心的话也应该指出这种情况。修改后的逻辑语句:∀i,if Di≤DM ⇒ Ci>CM
接下来的思路就明朗了,我们依据离海边的距离对所有旅店进行排序,这里我们使用的是修改后的快速排序(即对D进行排序,C跟随,当然把旅店定义成结构体或类更方便),当两个酒店离海边距离相同时,我们把便宜的那个排在前面,然后我们就可以把D看成自变量x,C看成因变量y,初始时就已经有一个满足条件的旅店M(因为没有比排在最前面的那个旅店离海边更近并且还更便宜的了),即初始时candidate_n = 1,我们从第二个旅店向后扫描C,每找到一个CM比之前的C都小,计数器candidate_n就加1,最后输出candidate_n即可。
源码:
#include<iostream>
using namespace std; void exchange(int A[], int i, int j) // 交换A[i]和A[j]
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
} int partition(int A[], int B[], int left, int right)// 划分函数
{
int pivot_A = A[right]; // 选择子数组最后一个元素作为基准
int pivot_B = B[right];
int tail = left - ; // tail为小于基准的子数组最后一个元素的索引
for (int i = left; i < right; i++) // 遍历基准以外的其他元素
{
if (A[i] < pivot_A) // 把小于基准的元素放到前一个子数组中
{
tail++;
exchange(A, tail, i);
exchange(B, tail, i);
}
if (A[i] == pivot_A && B[i] < pivot_B) // 当两个酒店离海边距离相同时,我们把便宜的那个排在前面
{
tail++;
exchange(A, tail, i);
exchange(B, tail, i);
}
}
exchange(A, tail + , right); // 最后把基准放到前一个子数组的后边,剩下的子数组既是大于基准的子数组
exchange(B, tail + , right);
return tail + ; // 返回基准的索引
} void quicksort(int A[], int B[], int left, int right)
{
int pivot_index = A[right];
if (left < right)
{
pivot_index = partition(A, B, left, right);
quicksort(A, B, left, pivot_index - );
quicksort(A, B, pivot_index + , right);
}
} int main()
{
int N,candidate_n = ;
while (scanf("%d", &N) && N) // 输入酒店的个数N,N为0时直接结束程序
{
int* D = (int *)malloc(N * sizeof(int));// 为了节省空间这里我们根据N的大小动态分配内存
int* C = (int *)malloc(N * sizeof(int));
for (int i = ; i < N; i++)
{
scanf("%d%d", &D[i], &C[i]);
}
quicksort(D, C, , N - ); // 调用修改后的快排算法依据D对旅店进行排序,C跟随
int min = C[];
candidate_n = ; // 排在最前面的旅店必然满足条件
for (int i = ; i < N; i++)
{
if (C[i] < min) // 每找到一个旅店比前面的都便宜
{
min = C[i];
candidate_n++; // 计数器加1
}
}
printf("%d\n", candidate_n);
candidate_n = ;
free(D); // 释放空间
free(C);
}
return ;
}
显然,程序的时间复杂度O(nlogn),运行结果如下:
POJ-2726-Holiday Hotel的更多相关文章
- POJ 题目3667 Hotel(线段树,区间更新查询,求连续区间)
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13805 Accepted: 5996 Descriptio ...
- POJ 3667 & 1823 Hotel (线段树区间合并)
两个题目都是用同一个模板,询问最长的连续未覆盖的区间 . lazy代表是否有人,msum代表区间内最大的连续长度,lsum是从左结点往右的连续长度,rsum是从右结点往左的连续长度. 区间合并很恶心啊 ...
- POJ 2726
#include <iostream> #include <algorithm> #define MAXN 10005 using namespace std; struct ...
- A过的题目
1.TreeMap和TreeSet类:A - Language of FatMouse ZOJ1109B - For Fans of Statistics URAL 1613 C - Hardwood ...
- 线段树(区间合并) POJ 3667 Hotel
题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...
- poj 3667 Hotel (线段树)
http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 94 ...
- POJ P3667 Hotel——solution
Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and e ...
- POJ 3667 Hotel(线段树)
POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...
- 整理下线段树吧 poj hotel
除了上次的新学的有 区间更新 延迟更新 区间合并 先说下区间更新以及延迟更新吧 既然是对区间的维护 在求解一些问题的时候 有的时候没有必要对所有的自区间都进行遍历 这个时候 延迟标记就派上用场了 ( ...
随机推荐
- lodash接触:string-capitalize
1.capitalize : _.capitalize([string='']) Capitalizes the first character of string. 参数 [string=''] ( ...
- C#窗体 WinForm 对话框,流
一.对话框 ColorDialog:颜色选择控件 private void button1_Click(object sender, EventArgs e) { //显示颜色选择器 colorDia ...
- MVC——入门+简单的小实例
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controler)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法. ...
- bat脚本 -- 初步接触
服务器上的Tomcat 经常过一段时间就会死掉,为了防治Tomcat突然当掉影响业务,设置一个定时重启计划. bat脚本如下: @echo restart tomcat6 service, log t ...
- DOM创建和删除节点、HTML DOM常用对象[转]
创建和删除节点:——核心DOM 1. 创建单个元素节点:3步: 1. 创建空元素节点对象: var elem=document.createElement("标 ...
- ios 程序学习
马上着手开发iOS应用程序:五.提交应用与寻找信息 2013-01-11 15:36 佚名 apple.com 我要评论(0) 字号:T | T 本文介绍了您已经学习完如何开发一个优秀的iOS应用之后 ...
- python and django
[安装(CentOS 6.5)] 安装python, 采用yum install python,安装后为2.6版本 安装django 1.6.4,再高的版本,就需要python提升版本.下载并解压,然 ...
- 支持Android iOS,firefox(其它未测)的图片上传客户端预览、缩放、裁切。
var version = '007'; var host = window.location.host; function $$(id){return document.getElementById ...
- 块级元素 Vs 内联元素
HTML的元素可以分为两种: 块级元素(block level element ) 内联元素(inline element ) 二者的区别如下: 1. 块级元素独占一行(除非显示修改元素的displa ...
- 黑马程序员——OC语言 类和对象
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)类 1)类的声明 代码编写 ①定义一个Car类,拥有2个属性:轮子数 ...