2017-5-14 湘潭市赛 Parentheses 转化思想+贪心 使括号序列合法的最小花费。满足前面左括号的数量>=有括号的数量。

Parentheses
Accepted : 8           Submit : 19
Time Limit : 3000 MS           Memory Limit : 65536 KB

Parentheses

Bobo has a very long sequence divided into n consecutive groups. The i-th group consists of li copies of character ci where ci is either "(" or ")".

As the sequence may not be valid parentheses sequence, Bobo can change a character in the i-th group from "(" to ")" (and vice versa) with cost di. He would like to know the minimum cost to transform the sequence into a valid one.

Note:

    An empty string is valid.
    If S is valid, (S) is valid.
    If U,V are valid, UV is valid.

Input

The input contains zero or more test cases and is terminated by end-of-file. For each test case:

The first line contains an integer n. The i-th of the following n lines contains li,ci,di.

    1≤n≤105
    1≤l1+l2+?+ln≤109
    l1+l2+?+ln is even.
    1≤di≤109
    The sum of n does not exceed 106.

Output

For each case, output an integer which denotes the result.
Sample Input

4
1 ( 1
1 ( 2
1 ( 3
1 ) 4
2
500000000 ) 1000000000
500000000 ( 1000000000

Sample Output

2
500000000000000000

Note

For the first sample, Bobo should change only the character in the second group.

For the second sample, Bobo should change half of characters in both groups.

Source
XTU OnlineJudge 

/**
题目:Parentheses
链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1266
题意:从左到右有n个连续的组,每一组有Li个括号,要么全是左括号,要么全是右括号,以及该组的每一个左括号翻成右括号,
或者右括号翻成左括号的花费Di.可以对这n个组的括号进行翻转,每一个括号都可以选择翻或者不翻,使整个括号序列是一个合法括号序列。
思路:

我们知道合法括号序列,满足前面左括号的数量>=有括号的数量。前2k个,那么左括号数量>=k个。
首先把所有左括号翻成右括号,那么所有的括号都变成右括号了。可以先计算花费。然后把那些左括号变成右括号的
那些Di变成-Di。那么以后再对它进行翻转的时候,相当于一开始就没有翻转。可以抵消原先加上的花费。

从左到右对所有右括号贪心,满足前面左括号的数量>=有括号的数量的这种规则去处理。维护一个堆存储那些可以翻成左括号的位置,
如果当前需要翻成一个左括号,那么比较当前位置和堆里的,选择一个花费更小的翻成左括号计算花费。同时更新堆。

举个荔枝:
假设没有组的情况。只是纯粹的若干个括号;
位置:
 1 2 3 4 5 6 7 8
 ) ) ) ) ) ) ) )
一开始第一个位置,显然必须翻成左括号,由于堆为空,所以当前翻成左括号。堆仍然为空。
然后对pos=2处理,此时位置2,应该要至少一个左括号,因为前面pos=1已经翻成左括号了,所以当前这个暂时不用翻成左括号。把它扔进堆里。
pos=3;至少要有两个左括号,还差一个。堆顶的是pos=2的花费,当前是pos=3的花费。比较花费更小的,把它翻成左括号,然后更新堆。依次处理。

当然题目是分组的:

第一组:把所有右括号更新到堆。然后计算当前这个位置需要多少个左括号,从堆中取出来。
然后把第二组所有右括号放入堆,然后计算第二组末尾这个位置需要多少个左括号。然后减去原来已经有的左括号数量。
表示还要多少左括号,从堆中取出。依次处理即可。

*/

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int maxn = 1e5+100;
struct node1
{
    LL num;
    char ch[2];
    LL cost;
}a[maxn];

struct node
{
    LL num;
    LL cost;
    bool operator < (const node&k)const{
        if(cost!=k.cost) return cost>k.cost;///先出小的。
        return num>k.num;
    }
}t;
priority_queue<node> qu;
/// priority_queue<P, vector<P>, greater<P> > qu;
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        LL ans = 0;
        for(int i = 0; i < n; i++){
            scanf("%I64d%s%I64d",&a[i].num,a[i].ch,&a[i].cost);
            if(a[i].ch[0]==‘(‘){
                ans += a[i].num*a[i].cost;
                a[i].cost = -a[i].cost;
            }
        }
        while(!qu.empty()) qu.pop();
        LL pre = 0, sum = 0, need;
        for(int i = 0; i < n; i++){
            t.num = a[i].num;
            t.cost = a[i].cost;
            qu.push(t);
            sum += a[i].num;
            need = (sum+1)/2;
            need = need - pre;
            pre = (sum+1)/2;
            while(need>0&&!qu.empty()){
                t = qu.top();
                qu.pop();
                if(t.num>need){
                    t.num -= need;
                    qu.push(t);
                    ans += t.cost*need;
                    break;
                }else
                {
                    if(t.num==need){
                        ans += t.cost*need;
                        break;
                    }else
                    {
                        need -= t.num;
                        ans += t.cost*t.num;
                    }
                }
            }
        }
        printf("%I64d\n",ans);

    }
    return 0;
}
时间: 2024-10-10 06:14:45

2017-5-14 湘潭市赛 Parentheses 转化思想+贪心 使括号序列合法的最小花费。满足前面左括号的数量>=有括号的数量。的相关文章

51CTO论坛搜索升级,支持模糊查询 2017.6.14

51CTO论坛搜索进行升级,使用新搜索算法,支持模糊查询,更容易查找到相关帖子.目前的结果切换到so.51cto.com,欢迎大家体验.在论坛首页顶部搜索框搜索已经支持最新搜索技术,后续会在版块页.帖子页的搜索也使用新搜索技术.2017.6.14 过去的论坛搜索,是在论坛数据库搜索,一方面搜索需要等待时间长,点击一次才能进入,另一方面搜索不支持模糊查询,经常找不到搜索结果. 这次搜索的升级切换,也依然可能有问题,欢迎大家留言说说自己的体验和问题,后面我们还会继续优化搜索算法,提升搜索体验.

Old Sorting(转化成单调序列的最小次数,置换群思想)

Old Sorting Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1166 Description Given an array containing a permutation of 1 to n, you have to find the minimum number of swaps to sort the array i

一个超漂亮的Java版博客系统,内置14套皮肤,已经转化为标准的Eclipse项目,直接导入即可

原文:一个超漂亮的Java版博客系统,内置14套皮肤,已经转化为标准的Eclipse项目,直接导入即可 源代码下载地址:http://www.zuidaima.com/share/1550463745002496.htm MrZhao只分享精品,话不多说,直接上图      - 为了压缩文件我把WEB-INF下面的lib包打包放在网盘下载地址:http://pan.baidu.com/s/1hqqqWOc - 把lib解压进去以后项目直接导入Eclise即可运行 - 数据库Mysql,确保一个新

9.14——模拟赛

T1 仙 临江仙 旧梦  (Topcoder SRM 703 div2 500pts) 题目背景闻道故园花陌,今年奼紫嫣红.扬帆直渡水千重.东君何解意,送我一江风.还是昔时庭院,终得醉卧花丛.残更惊醒月明中.流光如旧岁,多少梦成空.题目描述#define goodcatdog gcd#define important i#define judge j神说 每个梦想就是一轮月亮,高高地孤寂地挂在清冷的夜空.为了让月亮不再孤独,灯神给她找了好多好多伴儿.现在天空上就有n轮月亮啦!月亮在天上跟相邻的伙

2017/11/3模拟赛

块(block)[问题描述]拼图达人小 C 手里有 n 个 1*1 的正方形方块, 他希望把这些方块拼在一起, 使得拼出的图形周长最小, 要求方块不能重叠. 擅长拼图的小 C 一下就求出了这个周长, 顺便他想考考你会不会求.[输入格式]多组数据, 第一行一个正整数 T, 表示数据组数.接下来 T 行, 每行一个正整数 n, 表示方块数.[输出格式]输出 T 行, 每行一个正整数, 表示答案.[样例输入]3 4 1122[样例输出]81420[数据范围]对于 20%的数据, n<=20:对于 40

网易2017秋招笔试题3:最长公共子括号序列长度

[问题来源]网传的2017网易秋招笔试题 [问题描述] [算法思路] 下面的解题思路摘自  http://www.cnblogs.com/Atanisi/p/7500186.html 刚看到题我就想到暴力解,深搜出所有合法的括号序列,再依次比较公共子序列的长度,返回最长的.但是深搜一般和路径有关,这道题仅仅需要最大公共子序列的长度.而我们发现最大公共子序列的长度就是 s.size() - 1(当且仅当修改距离为 1 时 LCS 最大), 那么我们就想到,可以变换 s 中一个括号的位置,枚举所有的

五大算法思想—贪心算法

贪心法理解 贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变.换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优. 一句话:不求最优,只求可行解. 判断贪心法 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解? 我们可以根据贪心法的2个重要的性质去证明:贪心选择性质和最优子结构性质. 1.贪心选择性质 什么叫贪心选择?从字义上就是贪心也就是目光短线,贪图眼前利益,在

[2012山东ACM省赛] Pick apples (贪心,全然背包,枚举)

Pick apples Time Limit: 1000MS Memory limit: 165536K 题目描写叙述 Once ago, there is a mystery yard which only produces three kinds of apples. The number of each kind is infinite. A girl carrying a big bag comes into the yard. She is so surprised because s

20181225模拟赛 T1 color (转化思想,分拆思想)

题目: 有?块有 n 段的栅栏,要求第 i 段栅栏最终被刷成颜色 ci .每?次可以选择 l, r 把第l . . . r 都刷成某种颜色,后刷的颜?会覆盖之前的.?共有 m 种颜色,雇主知道只需要用m 次就能达成目标,因此你只能刷 m 次.但是你还是可以想办法磨洋工,你希望最?化 m 次刷漆选择的区间长度(r ? l + 1)总和. 分析: 这个题目有一种似曾相识的感觉-- 罢了--人生三大错觉--手机振动.有人敲门.这题我会-- 这个题呢,题目里有提到,只需要m次即可完成涂色,这说明什么?