n家客栈,1~n编号,每家按照某一种色调装饰,共k种,每家客栈都设有咖啡店,每家咖啡店均有各自的最低消费
两位游客,要求住在颜色相同,且不是同一个客栈,在两人的客栈间选择咖啡店(包括他们住的客栈),要求最低消费不超过p
求有多少种方案
输入格式:
第一行n,k,p,表示客栈的个数,色调数目,和可接受的最低消费的最高值
接下来n行,分别表示第i号客栈的色调和咖啡店的最低消费
输出格式
一个整数,表示方案总数
输入样例#1:
5 2 3
0 5
1 3
0 2
1 4
1 5
输出样例#1:
3
1 2 3 4 5
0 1 0 1 1
5 3 2 4 5

解题思路:
基本暴力思路是手动搜索出现过的,和当前位置颜色相同的客栈的位置
再依次判断
这样很慢。显然是不行的
然后我们可以想到这样一个思路(性质?):
如果我们累计不算当前位置,之前所出现过的当前颜色的总次数
那么如果可行,我们就要在总方案数上累加这个数。我们能注意到的是,每出现一个颜色,所需要检测的状态只增加了上一个同样颜色的位置和当前位置是否满足题意,需要方案数+1
但是对于是否可行这个问题,我们就需要开一个辅助数组记录当前颜色上一次出现的位置
但是如果不可行呢?继续向前,上上一个位置,上上上一个位置都不可行呢?
这就提示我们要开第二个辅助数组,记录方案数,这个数组的值只有满足了上一个位置和当前位置这一决策符合题意时才能更新,这样保证了我们每次累加的方案数永远都是合法的未知的方案数
于是又出现了新的问题:拿什么值去更新?
我们可以发现,若是上一个位置和当前位置可行,那么当前位置与此前所有该颜色的位置匹配都可行,这也就是说,在该情况下,我们累计的是不算当前位置,当前颜色出现过的总次数
这也就是我们要拿来去更新辅助数组2的值
于是我们再开第三个辅助数组,记录不算当前位置,该颜色出现过的次数
接着代码的实现就非常容易了

 #include<bits/stdc++.h>
using namespace std;
const int maxn = ;
struct enkidu {
int color, cost;
}a[maxn];
int n, k, p;
int color_cnt[], color_last[];
int color_num[];
int last_acc;
int ans = ;
bool vis[maxn]; inline int read() {
int x = , y = ;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + ch - '';
ch = getchar();
}
return x * y;
} int main() {
memset(color_cnt, , sizeof(color_cnt));
memset(color_num, , sizeof(color_num));
n = read(), k = read(), p = read();
for(int i = ; i <= n; ++i)
a[i].color = read(), a[i].cost = read();
for(int i = ; i <= n; ++i) {
int cl = a[i].color;
if(a[i].cost <= p) last_acc = i;//求上一个小于p的位置
if(vis[cl]) {
if(color_last[cl] <= last_acc) //若上一个当前颜色的位置比上一个小于p的位置小,则说明目前当前颜色出现过的总次数将是要累加的答案
color_num[cl] = color_cnt[cl];//否则要累加的是上一个满足要求的当前颜色的位置记录的出现过的次数
color_last[cl] = i;//更新上一个当前颜色出现的位置
ans += color_num[cl];//累加答案
color_cnt[cl]++;//统计到目前为止,当前颜色出现的次数
}
else if(!vis[cl]) {//若当前颜色从未见过
color_last[cl] = i;
color_cnt[cl]++;
vis[cl] = ;
}
}
cout << ans << '\n';
return ;
}

NOIP2011选择客栈的更多相关文章

  1. NOIP2011选择客栈[递推]

    题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  2. [NOIP2011] 选择客栈

    题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  3. 【组合数】[NOIP2011]选择客栈[c++]

    题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  4. 一本通1546【NOIP2011】选择客栈

    1546:NOIP2011 选择客栈 时间限制: 1000 ms         内存限制: 524288 KB 题目描述 丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号. ...

  5. 【11NOIP提高组】选择客栈(信息学奥赛一本通 1546)(洛谷 1311)

    题目描述 丽江河边有nn家很有特色的客栈,客栈按照其位置顺序从 11到nn编号.每家客栈都按照某一种色调进行装饰(总共 kk 种,用整数 00 ~k-1k−1 表示),且每家客栈都设有一家咖啡店,每家 ...

  6. 【五一qbxt】day7-2 选择客栈

    停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...

  7. 洛谷P1311 [NOIP2011提高组Day1T2]选择客栈

    P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...

  8. 选择客栈noip2011

    哈,没想到吧.今天居然有两篇(算什么,厕所读物吗 选择客栈 本题的更优解请跳转zt 这题11年,刚改2day. 对于30% 的数据,有 n ≤100: 对于50% 的数据,有 n ≤1,000: 对于 ...

  9. Noip2011 提高组 选择客栈

    P1311 选择客栈 直通 思路: ①看题,我们可以发现一个显然的性质,即当最左边的客栈向右移动时,最右边的客栈时单调向右的,并且右端点往右的客栈也符合要求.(因为只要左侧有一个满足的,右边的自然可以 ...

随机推荐

  1. CMD批处理把txt文本中的每行写入一个新文件,第一列作文件名

    需求 现在有一个文件格式如图 ID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17001 89.84 8.87 1.29 -0.0 0.0 68.99 0.0 0. ...

  2. java一个接口可以继承另外一个接口吗

    一个接口可以继承多个接口. interface C extends A, B {}是可以的. 一个类可以实现多个接口: class D implements A,B,C{} 但是一个类只能继承一个类, ...

  3. JavaScript 被忽视的细节

    语句/表达式 换个角度理解语句(statemaents)和表达式(expressions):表达式不会改变程序的运行状态,而语句会.还有一种叫做表达式语句,可以理解为表达式和语句的交集,如({a:1} ...

  4. java实现极简的LRU算法

    import java.util.LinkedHashMap;import java.util.Map; /** * LRU (Least Recently Used)  */public class ...

  5. 百度vue服务端渲染(ssr)有感

    前端各种框架工具层次不穷,日新月异,越学越混乱了快 知乎上看到了一段回复,豁然开朗的感觉. Web 2.0时代最大的思想革命本质不是前后端分离,而是把网页当作独立的应用程序(app).前后端分离只是实 ...

  6. MySql数据库学习总结(MySQL入门到精通)

    2017.1.24-2.3日(在大兴实验室) 1.数据库存储引擎: (1)MyISAM: 访问速度快,对事物完整性没要求,并以访问为主的适合这个 (2)InnoDB: 更占磁盘空间,需要进行频繁的更新 ...

  7. nginx 设置client header 的大小与400错误

    nginx默认的header长度上限是4k,如果超过了这个值 如果header头信息请求超过了,nginx会直接返回400错误可以通过以下2个参数来调整nginx的header上限 client_he ...

  8. (转载)--SG函数和SG定理【详解】

    在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点 ...

  9. 【LuoguP1169 bzoj1057】[ZJOI2007]棋盘制作

    首先把矩阵转化一下,把横纵坐标和为偶数点的值取反,这样就转化成求最大的'0'或'1'矩阵. 这道题每个数字是在格子内的,不能在边界包含障碍点. 求最大的0矩阵时,把1作为障碍点.求1同理. 然后求最接 ...

  10. bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401

    这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...