【贪心+前缀】C. Fountains
http://codeforces.com/contest/799/problem/C
【题意】
有n做花园,有人有c个硬币,d个钻石 (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100 000) ,每一个花园用三个维度描述(a,b,c),分别是美丽度,所花钱币个数,钱币种类,当然,钱币之间不能兑换,该人必须要建筑两座花园,如果可以,输出两座花园总的美丽度,否则输出0;
【思路】
首先,有三种分类:
- 两座花园一座用钻石,一座用硬币
- 两座花园都用钻石
- 两座花园都用硬币
注意两座花园只能同时都买,不能只买一座
第一种情况比较简单,只要找出在两种分类中美丽度分别最大的即可
第二种情况和第三种是类似的,我们只考虑第二种:
首先,价格超过限度的直接省去,然后我们想知道价值和不超过限度的最大美丽度是多少。
我们可以枚举一座花园的价值price1,然后找到另一座满足price2<=c-price1的美丽度最大的花园。
一个很强的做法就是:
按price从小到大排序,for_max数组记录前缀0~i的最大美丽度,只要price[i]满足<=c-price1,就可以i++,最后找到的美丽度一定是最大的。
而且这样做只要一次for循环,price1从后向前枚举,price2的限界一定是增大的,所以只要不断在上一层循环的基础上增加就可以了~
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm> using namespace std;
const int maxn=1e5+;
typedef pair<int,int> pii;
vector<pii> CC,DD;
int n,c,d; int Solve(vector<pii> z,int money)
{
int for_max[maxn];
int sz=z.size();
sort(z.begin(),z.end());
for_max[]=;
for(int i=;i<=sz;i++)
{
for_max[i]=max(for_max[i-],z[i-].second);
}
int i=;
int ans=;
for(int k=sz-;k>=;k--)
{
while(i<k&&z[i].first+z[k].first<=money)
{
i++;
}
i=min(i,k);
if(i>)
{
ans=max(ans,for_max[i]+z[k].second);
} }
return ans;
}
int main()
{
scanf("%d%d%d",&n,&c,&d);
int p,b;
int max_c=,max_d=;
char tag[];
for(int i=;i<n;i++)
{
scanf("%d%d%s",&b,&p,tag);
if(tag[]=='C')
{
if(p>c)
{
continue;
}
CC.push_back(make_pair(p,b));
max_c=max(max_c,b);
}
else
{
if(p>d)
{
continue;
}
DD.push_back(make_pair(p,b));
max_d=max(max_d,b);
}
}
int ans;
if(max_c==||max_d==)
{
ans=;
}
else
{
ans=max_c+max_d;
}
ans=max(ans,Solve(CC,c));
ans=max(ans,Solve(DD,d));
printf("%d\n",ans);
return ;
}
贪心+前缀
【贪心+前缀】C. Fountains的更多相关文章
- hdu3613 Best Reward manacher+贪心+前缀和
After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...
- suoi38 卖XY序列 (贪心+前缀和)
因为只能带一个,买卖价格又一样,所以只要右边的比左边的大,就从这买下来然后带到下一个卖掉就行了(我想到别处再卖的话大不了再重新买回来嘛) 所以给max(w[i]-w[i-1],0)维护一个前缀和就行了 ...
- 51nod 1344 走格子【贪心/前缀和】
1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...
- Wannafly Camp 2020 Day 3E 棋技哥 - 贪心,前缀和
#include <bits/stdc++.h> using namespace std; char c[505][505]; int n,m,t,a[505][505],s[505][5 ...
- Codeforces 578B "Or" Game (前缀和 + 贪心)
Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] 题目链接:B. "Or" Game You are given \(n\) ...
- Codeforces 1062 - A/B/C/D/E - (Undone)
链接:http://codeforces.com/contest/1062 A - Prank - [二分] 题意: 给出长度为 $n(1 \le n \le 100)$ 的数组 $a[1 \sim ...
- NOIp2018停课刷题记录
Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...
- [洛谷P1169][题解][ZJOI2007]午餐
这是题目吗? 显然的DP,讲几个重要的地方 1.贪心:让吃饭时间长的先排队(证明从略) 2.状态: f[i][j][k]代表前i个人,一号时间j,二号时间k显然MLE 所以压缩成f[i][j]代表前i ...
- CF Round #600 (Div 2) 解题报告(A~E)
CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...
随机推荐
- CF989C A Mist of Florescence
思路: 有趣的构造题. 实现: #include <bits/stdc++.h> using namespace std; ][]; void fillin(int x, int y, c ...
- leetcode410 Split Array Largest Sum
思路: dp. 实现: class Solution { public: int splitArray(vector<int>& nums, int m) { int n = nu ...
- CCF|火车购票|Java|80分
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Sc ...
- 深入解析Web Services
SOA,面向服务器建构,是一款架构,这几年虽然没前几年那么流行,但是还是有很多企业在用,而Web Services是目前适合做SOA的主要技术之一,通过使用Web Services,应用程序可以对外发 ...
- 洛谷 P1216 [USACO1.5]数字三角形 Number Triangles(水题日常)
题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 ...
- x86和i386
x86: 1 9 7 8年6月,I n t e l公司推出了8 0 8 6,一个1 6位微处理器,它可访问的存储空间达到1 M B. Intel x86家族继续发展,1 9 8 5年出现了3 2位的3 ...
- uva1610 Party Games
细节值得注意 注意vector<string>是可以直接sort的! #include <iostream> #include <string> #include ...
- windwos .bat脚本大全
记录一个很有用比较全面的windows .bat脚本网站 https://www.cnblogs.com/zhaoqingqing/p/4620402.html
- JAVA用freemarker生成复杂Excel。(freemarker)
在生成Excel的时候,大多时候都是使用poi,jxl等进行的,但是对于复杂的Excel来说,这个工作量是非常的大的,而且,对于我这么懒的人来说,这是相当痛苦的一件事情,所以,我不得不找找有没有简单一 ...
- strong&weak
copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议 ...