zoukankan      html  css  js  c++  java
  • 【P3056】【USACO12NOV】笨牛Clumsy Cows

    P3056 [USACO12NOV]笨牛Clumsy Cows


    题目描述

    Bessie the cow is trying to type a balanced string of parentheses into her new laptop, but she is sufficiently clumsy (due to her large hooves) that she keeps mis-typing characters. Please help her by computing the minimum number of characters in the string that one must reverse (e.g., changing a left parenthesis to a right parenthesis, or vice versa) so that the string would become balanced.

    There are several ways to define what it means for a string of parentheses to be "balanced". Perhaps the simplest definition is that there must be the same total number of ('s and )'s, and for any prefix of the string, there must be at least as many ('s as )'s. For example, the following strings are all balanced:

    ()(())()(()())

    while these are not:

    )(())(((())))

    给出一个偶数长度的括号序列,问最少修改多少个括号可以使其平衡。

    输入输出格式

    输入格式:
    • Line 1: A string of parentheses of even length at most 100,000 characters.
    输出格式:
    • Line 1: A single integer giving the minimum number of parentheses that must be toggled to convert the string into a balanced string.

    输入输出样例

    输入样例#1:
    ())( 
    
    输出样例#1:
    2 
    

    说明

    The last parenthesis must be toggled, and so must one of the two middle right parentheses.


    陷入dp的泥潭无法自拔,然后终于在题解中看到了一个真·贪心。

    其实可以这样贪:只需保证每一个前缀左括号数目大于等于右括号的数目即可。

    这样的话有两种贪法(但其实是一种而已?)


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    
    
    const int MAXN = 100000 + 10;
    
    
    char str[MAXN];
    int n;
    int cnt;
    int num;
    
    int main()
    {
    	freopen("data.txt", "r", stdin);
    	scanf("%s", str + 1);
    	n = strlen(str + 1);
    	for(int i = 1;i <= n;i ++)
    	{
    		if(str[i] == '(' )num ++;
    		else num--;
    		if(num < 0)cnt++,num+=2;
    	}
    	printf("%d", cnt + num/2);
    	return 0;
    }

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    
    
    const int MAXN = 100000 + 10;
    
    
    char str[MAXN];
    int n;
    int cnt;
    int num;
    
    int main()
    {
    	freopen("data.txt", "r", stdin);
    	scanf("%s", str + 1);
    	n = strlen(str + 1);
    	for(int i = 1;i <= n;i ++)
    	{
    		if(str[i] == '(' )num ++;
    		else if(str[i] == ')' && num > 0)num--;
    		else cnt++,num++;
    	}
    	printf("%d", cnt + num/2);
    	return 0;
    }



  • 相关阅读:
    k8s service的DNS名称解析之CoreDNS
    k8s service负载均衡实现之iptables
    k8s 将项目暴露到互联网访问
    k8s 日志按体现分类与采集思路
    k8s ingressd的http对外暴露网站
    k8s 容器交付流程和项目部署流程
    k8s ingress使用DaemonSet部署
    Google Base与科学家数据共享 (Nature Vol 438|24 November 2005)
    总结:rdf:ID和rdf:about的区别(转载)
    一个元搜索引擎
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/6537735.html
Copyright © 2011-2022 走看看