关闭

CF #437

167人阅读 评论(0) 收藏 举报
分类:

CF #437

http://codeforces.com/contest/867


B. Save the problem!

乱搞

Code:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int main(){
    int n;
    scanf("%d",&n);
    if(n==1) printf("1 1\n1\n");
    else
    printf("%d 2\n1 2\n",(n-1)*2);
}

C. Ordering Pizza

贪心

pizza个数 = (si)/S
先让所有人都吃快乐值大的那种,快乐值之和记为ans
如果这样做pizza个数变大了,此时一定是有一个A和一个B还没有吃完
(pizza个数最多变大1,并且A、B剩下的块数之和一定<=S)
因此我们可以不买最后一个A,让原来吃这个A的人都去吃B剩下的
贪心的选择a[i]-b[i]最小的前几个人即可
不买最后一个B同理

Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const ll N = 200005;

ll n,S,ans,tot,num,tota,totb;
ll s[N],a[N],b[N];
vector<pll> A, B;

int main(){
    freopen("3.in","r",stdin);
    scanf("%lld%lld",&n,&S);
    for(ll i=1;i<=n;i++){
        scanf("%lld%lld%lld",s+i,a+i,b+i);
        tot+=s[i];
    }
    num=(tot-1)/S+1;
    for(ll i=1;i<=n;i++){
        if(a[i]>b[i]){
            A.push_back(make_pair(a[i]-b[i],s[i]));
            ans+=a[i]*s[i]; tota+=s[i];
        }
        else{
            B.push_back(make_pair(b[i]-a[i],s[i]));
            ans+=b[i]*s[i]; totb+=s[i];
        }
    }
    if((tota-1)/S+1 + (totb-1)/S+1 == num) printf("%lld\n",ans);
    else{
        sort(A.begin(),A.end());
        sort(B.begin(),B.end());
        // A->B
        ll ans1=ans; ll cha=tota%S;
        for(ll i=0;cha;i++){
            ll x=min(cha,A[i].second);
            ans1-=A[i].first*x; cha-=x;
        }
        // B->A
        ll ans2=ans; cha=totb%S;
        for(ll i=0;cha;i++){
            ll x=min(cha,B[i].second);
            ans2-=B[i].first*x; cha-=x;
        }
        printf("%lld\n",max(ans1,ans2));
    }
}

E. Buy Low Sell High

STL·堆

维护小顶堆,每次读入一天的价格x,如果:
1. x<堆顶:直接insert(x)
2. 否则,ans+=x-堆顶,弹出堆顶,insert两次x

为啥insert两次x呢?
第一次是正常的加入,跟(1)一样
第二次与弹出堆顶合起来,实际上相当于把堆顶换成x
这实际上是一种撤销操作,如果后面的一个元素选择了第二个x,相当于它直接选择了x选择的那个

Code:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <set>
using namespace std;

int n,x; long long ans; 
multiset<int> s;

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        if(!s.empty() && *s.begin() < x){
            ans+=x-*s.begin();
            s.erase(s.begin());
            s.insert(x); s.insert(x);
        }
        else s.insert(x);
    }
    printf("%lld\n",ans);
}
0
0
查看评论

cf 437 D(并查集)

链接:http://codeforces.com/problemset/problem/437/D     两个集合A,B的个数分别n,m,当着两个集合通过f(a,b)连通时f(a,b)是最小的边,题目结果为n*m*f(a,b)*2  所以可以将边从大到小排序...
  • a73265
  • a73265
  • 2016-07-12 19:22
  • 119

uva 437 - The Tower of Babylon(DAG最长路)

本文出自   http://blog.csdn.net/shuangde800 题目:点击打开链接 题目大意 有n个长宽高为x,y,z的砖头, 代码
  • shuangde800
  • shuangde800
  • 2013-08-12 13:15
  • 3066

uva437 - The Tower of Babylon(DAG上的DP)

题目:uva437 - The Tower of Babylon(DAG上的DP) 题目大意:给你一些立方体,给出长宽高XYZ。现在希望你将这些立方题叠起来,使得最后的高度最大,并且这些立方体是可以无限次使用的,但是一个立方体要在另一个立方体的上面的话是需要满足这个立方体的底面是可以完全包...
  • u012997373
  • u012997373
  • 2014-08-06 20:55
  • 1280

uva 437 动态规划

给定一些立方体,每种立方体有长宽高三个属性,可以任意变换摆放姿势,每种立方体有无限个,要把其中的一些摆起来,求最大的高度。要求在上面的立方体必须底部的长宽都小于在下面的立方体的顶部的长宽。 可以把一个立方体当成三个存到数组中,x,y,z轮换着当高,剩下的两个随便当长或者宽就行。 先把他们按照面积...
  • liyunlong41
  • liyunlong41
  • 2015-08-08 12:40
  • 261

UVa 437 - The Tower of Babylon LIS

The Tower of Babylon  Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been for...
  • cyendra
  • cyendra
  • 2013-04-30 19:31
  • 789

让fopen打开在不同的代码页下创建的文件

让fopen打开在不同的代码页下创建的文件问题:    英文Win2000下,应用程序操作一个文件名中带中文字符的文件时出错。分析:    文件是在中文Win2000下创建好之后,再拷贝到英文Win2000的,初步认为这涉及到代码页的问题!...
  • coldcrane
  • coldcrane
  • 2005-03-20 02:04
  • 2695

CF #437 A. Between the Offices【字符串匹配】

A. Between the Offices time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output As you may know,...
  • Irish_Moonshine
  • Irish_Moonshine
  • 2017-10-21 10:11
  • 60

uva--437The Tower of Babylon+dp

题意:       给定一些立方体,对于两个立方体,只有其中一个底面两个边都严格小于另一个才可以放在其上面。求可以得到的最大高度。 思路:     一个立方体可以转成6个底面不同的具有不同权值(高度)的矩形,然...
  • acm_lkl
  • acm_lkl
  • 2014-12-31 13:33
  • 467

CF卡技术详解——笔记

知识太全面了,摘抄摘不完,还是粘过来加上注释和笔记吧。 重点以及断句用加粗,注释用红括号。 一.CF卡技术及规格 一.CF卡技术及规格     1.CF卡简史    ...
  • huqinweI987
  • huqinweI987
  • 2013-12-04 21:45
  • 15931

捷克下chcp 437命令无效, Microsoft的bug?

<br />这几天做一个小工具, 涉及到多个系统语言, 具体是通过windows系统命令来获得一些系统信息, 比如说输入systeminfo来获得系统信息然后通过正则表达式匹配来得到我想要的, 但是这里的问题是正则表达式只能匹配英文的, 所以必须把本地的语言以英文方式输出,比如说捷克语w...
  • sanmaofly
  • sanmaofly
  • 2010-07-07 22:22
  • 1699
    个人资料
    • 访问:14093次
    • 积分:1396
    • 等级:
    • 排名:千里之外
    • 原创:129篇
    • 转载:14篇
    • 译文:0篇
    • 评论:3条
    最新评论