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的更多相关文章

  1. hdu3613 Best Reward manacher+贪心+前缀和

    After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...

  2. suoi38 卖XY序列 (贪心+前缀和)

    因为只能带一个,买卖价格又一样,所以只要右边的比左边的大,就从这买下来然后带到下一个卖掉就行了(我想到别处再卖的话大不了再重新买回来嘛) 所以给max(w[i]-w[i-1],0)维护一个前缀和就行了 ...

  3. 51nod 1344 走格子【贪心/前缀和】

    1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...

  4. 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 ...

  5. Codeforces 578B "Or" Game (前缀和 + 贪心)

    Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] 题目链接:B. "Or" Game You are given \(n\) ...

  6. Codeforces 1062 - A/B/C/D/E - (Undone)

    链接:http://codeforces.com/contest/1062 A - Prank - [二分] 题意: 给出长度为 $n(1 \le n \le 100)$ 的数组 $a[1 \sim ...

  7. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

  8. [洛谷P1169][题解][ZJOI2007]午餐

    这是题目吗? 显然的DP,讲几个重要的地方 1.贪心:让吃饭时间长的先排队(证明从略) 2.状态: f[i][j][k]代表前i个人,一号时间j,二号时间k显然MLE 所以压缩成f[i][j]代表前i ...

  9. CF Round #600 (Div 2) 解题报告(A~E)

    CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...

随机推荐

  1. Vue checkbox默认值改变

    <label><input  v-bind:true-value="1" v-bind:false-value="0" type=" ...

  2. Jquery 中使用String.Format

    第一种方法: String.format = function() { if (arguments.length == 0) return null; var str = arguments[0]; ...

  3. check_http.c:312: error: ‘ssl_version’

    安装nagios-plugins-1.4.16,安装的过程中出现了错误,提示如下.check_http.c:312: error: ‘ssl_version’ undeclared (first us ...

  4. Java练习题01

    问题: 利用二维非矩阵数组输出下面的数字 0 1 2 2 3 4 3 4 5 6 代码: public class Page98{     public static void main(String ...

  5. Summary of 2016 International Trusted Computing and Cloud Security Summit

    1)      Welcome Remarks 2)      The advancement of Cloud Computing and Tursted Computing national st ...

  6. 51nod 1432 独木舟

    基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承 ...

  7. liunx 中安装mysql 图形界面 phpmyadmin

    是浏览器图形界面 1. 安装mysql 图形管理工具. 2. 使用phpmyadmin 图像化工具. 3.下载地址  http://www.phpmyadmin.net/ 4. 查看是否安装这两个包 ...

  8. dropuser - 删除一个 PostgreSQL 用户帐户

    SYNOPSIS dropuser [ option...] [ username] DESCRIPTION 描述 dropuser 删除一个现有 PostgreSQL 用户 和 该用户所有的数据库. ...

  9. uva12265 Selling Land

    见紫书.(c,h)的更新策略://前面的高度为0了,直接插入因为ans==-c+h,c大,h还小,那么肯定不是最优左上角,更新新加入列的列//新的一列高度最小,就删掉了其他的,只留这个高度从上到下,从 ...

  10. tabsGif

    tabsGif