zoukankan      html  css  js  c++  java
  • 洛谷 P2073 送花

    题目背景

    小明准备给小红送一束花,以表达他对小红的爱意。他在花店看中了一些花,准备用它们包成花束。

    题目描述

    这些花都很漂亮,每朵花有一个美丽值W,价格为C。

    小明一开始有一个空的花束,他不断地向里面添加花。他有以下几种操作:

    操作 含义

    1 W C 添加一朵美丽值为W,价格为C的花。

    3 小明觉得当前花束中最便宜的一朵花太廉价,不适合送给小红,所以删除最便宜的一朵花。

    2 小明觉得当前花束中最贵的一朵花太贵,他心疼自己的钱,所以删除最贵的一朵花。

    -1 完成添加与删除,开始包装花束

    若删除操作时没有花,则跳过删除操作。

    如果加入的花朵价格已经与花束中已有花朵价格重复,则这一朵花不能加入花束。

    请你帮小明写一个程序,计算出开始包装花束时,花束中所有花的美丽值的总和,以及小明需要为花束付出的总价格。

    输入输出格式

    输入格式:

    若干行,每行一个操作,以-1结束。

    输出格式:

    一行,两个空格隔开的正整数表示开始包装花束时,花束中所有花的美丽值的总和。以及小明需要为花束付出的总价格。

    输入输出样例

    输入样例#1:
    1 1 1
    1 2 5
    2
    1 3 3
    3
    1 5 2
    -1
    
    输出样例#1:
    8 5

    说明

    对于20%数据,操作数<=100,1<=W,C<=1000。

    对于全部数据,操作数<=100000,1<=W,C<=1000000。

    【题目解释】

        正解是线段树来搞

        但是数据比较水,暴力也能卡一卡,下面是O(n) 的暴力,这题是对不起线段树的大名了(笑抽)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    int cnt=0;
    int x;
    bool flag=0;
    bool xx[1000001]={0};
    using namespace std;
    struct node{
        int w,c;
    }h[100010];int cmp2(const node a,const node b)
    {
        return a.c>b.c;
    }
    int cmp1(const node a,const node b)//cong xiao dao da
    {
        return a.c<b.c;
    }
    void ex()
    {
        sort(h+1,h+cnt+1,cmp1);
        xx[h[cnt].c]=0;
        cnt--;
    }
    void cheap()
    {
        sort(h+1,h+cnt+1,cmp2);
        xx[h[cnt].c]=0;
        cnt--;
    }
    int main()
    {
        scanf("%d",&x);
        while(x!=-1)
        {
            if(x==1)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                if(cnt==0)
                {
                    xx[b]=1;
                    cnt++;
                    h[cnt].w=a;
                    h[cnt].c=b;
                }
                else
                {
                    //sort(h+1,h+cnt+1,cmp1);
                    if(xx[b]==0)
                        cnt++,
                        xx[b]=1,
                        h[cnt].w=a,
                        h[cnt].c=b;
                }
            }
            if(x==2)
              if(cnt>0)
                ex();
            if(x==3)
              if(cnt>0)
                cheap();
            scanf("%d",&x);
        }
        int ans1=0,ans2=0;
        for(int i=1;i<=cnt;i++)
            ans1+=h[i].w,
            ans2+=h[i].c;
        printf("%d %d",ans1,ans2);
        return 0;
    }
  • 相关阅读:
    Java 7的javax.net.ssl.SSLHandshakeException
    Oracle数据泵导出数据库
    ORA-00054: 资源正忙 --锁表的解决方法
    Linux学习私人笔记-Shell基础
    Linux学习私人笔记-目录和文件的基本命令
    Linux学习私人笔记-文件基本命令
    Linux学习私人笔记-账号管理
    Linux学习私人笔记-Vim
    form提交表单时本地下载
    SQL Servel 中分页解决
  • 原文地址:https://www.cnblogs.com/xiaoningmeng/p/5796812.html
Copyright © 2011-2022 走看看