Topcoder SRM 327 Div1 300!

题意:给一个字符串,含有大写字母或者问号’?’。一个字符串被定义为ugly,则能在字符串中找到三个连续的元音字符或者五个非元音字符;一个字符串被定义为nice,则它不是ugly的。现在问,可否改将所有’?’变成字符,使得字符串成为nice或ugly的,如果都可以,输出”47”,如果只能一个,输出”UGLY”或”NICE”。

解法:对于是否可为ugly的情况,很简单,将每个’?’都变为元音,看是否存在3个连续的元音,再将每个’?’变为非元音,再看是否存在5个连续的非元音。。对于是否可为nice的情况,用贪心去做即可(不要想复杂,否则可能会进入大坑),首先,可以小证,对于连续的问号(问号数量大于1),一定可以将问号变换,使得字符串为nice。对于单个的问号,即一个问号,左右两边都不是问号,这个时候需要讨论下,贪心下就好了。。写完后一直在看别人代码,发现有更好的写法,不需要预处理什么,直接O(n)扫,用两个变量判一判就行了。

Best Code

#include<string>
using namespace std;
class NiceOrUgly{
public:
    bool isvol(char c){
        return c == ‘A‘ || c == ‘E‘ || c == ‘I‘ || c == ‘O‘ || c == ‘U‘;
    }
    string describe(string s){
        bool can1 = 0;
        int nv, nc;
        nv = nc = 0;
        for(int i = 0; i < s.length() && can1 == 0; i++){
            if(s[i] == ‘?‘) nv++, nc++;
            else if(isvol(s[i])) nv++, nc = 0;
            else nv = 0, nc++;
            if(nv >= 3 || nc >= 5) can1 = 1;
        }

        bool can2 = 1;
        nv = nc = 0;
        for(int i = 0; i < s.length() && can2 == 1; i++){
            if(s[i] == ‘?‘){
                if(nv == 2) nv = 0, nc = 1;
                else if(nc == 4) nv = 1, nc = 0;
                else nv = nc = 0;
            }
            else if(isvol(s[i])) nv++, nc = 0;
            else nv = 0, nc++;
            if(nv >= 3 || nc >= 5) can2 = 0;
        }

        if(can1 && can2) return "42";
        else if(can1 && !can2) return "UGLY";
        else return "NICE";
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 17:35:33

Topcoder SRM 327 Div1 300!的相关文章

Topcoder SRM 283 Div1 300

题意:二维空间中给n个点,求一条直线(直线只可平行于x轴或y轴或两条对角线),使得最多的点到该直线距离不超过D,返回最大数量值.n不超过50 解法:设直线为ax+by+c=0,将每个点和两两点的中点分别作为关键点,枚举每个关键点,再枚举四条过关键点的直线,求出到该直线距离不超过D的点数量.维护数量最大值即可.复杂是O(n3) Code #include<cmath> #include<cstdlib> #include<cstring> #include<algo

Topcoder SRM 525 Div1 300

题意:给一个n*m的矩形,每个方格要不为空,要不有金币,每次你可以将矩形所有金币选择一个方向(上下左右)移动一格,如果移动后有金币出矩形了,则该金币消失.问最少步骤使得方格金币恰好为K (1≤n,m≤30) 解法:枚举每个子矩形,如果该子矩形含有金币数量恰好为K,则贪心算出得到该子矩形的代价,即上下移动算一次代价,左右移动算一次代价,两次代价都分别等于 移动次数最小值*2+移动次数最大值 Code #include<cstdio> #include<algorithm> #incl

TOPCODER SAM 686 div1 300

// TOPCODER SAM 686 div1 300 Problem Statement 带有小中括号的括号序列,问可以去掉多少子串,使得剩下的非空串是合法的. Constraints 字符串长度不超过 40. Examples // ans[i] = count(s[i]) string s[] = {"()[]", "())", "()()", "([)]", "())[]][]([]()]]()]]]&qu

Topcoder SRM 643 Div1 250&lt;peter_pan&gt;

Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*......*pn,我们假设p0,p1,...,pn是单调不降的,那么v里存储的是下标为偶数 的N的质因数p0,p2,p4,...,p(2k).现在要求写一个程序,返回一个vector<long long>ans; ans里存储的是p0,p1,p2,...,pn. Limits Time Limit(m

Topcoder SRM 648 Div1 250

Problem 给一个长度为N的"AB"字符串S,S只含有两种字符'A' 或 'B',设pair(i,j)(0=<i<j<N)表示一对 i,j 使得S[i]='A',S[j]='B'.现给定一个K,求字符串S,使得pair(i,j)的个数恰好为K.若不存在,则返回空串. Limits Time Limit(ms): 2000 Memory Limit(MB): 256 N: [2, 50] K: [0 , N*(N-1)/2 ] Solution 若K>(N/2

Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

Problem Statement      The Happy Letter game is played as follows: At the beginning, several players enter the field. Each player has a lowercase English letter on their back. The game is played in turns. In each turn, you select two players with dif

topcoder srm 738 div1 FindThePerfectTriangle(枚举)

Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle with the following properties: The coordinates of each vertex are integers between 0 and 3000, inclusive. The perimeter of the triangle must be exactly

Topcoder SRM 603 div1题解

昨天刚打了一场codeforces...困死了...不过赶在睡前终于做完了- 话说这好像是我第一次做250-500-1000的标配耶--- Easy(250pts): 题目大意:有一棵树,一共n个节点,每个节点都有一个权值,两人A和B分别进行操作,由A先手,每人可以选择一条边,将它删掉得到两个联通块.游戏不断进行下去,最后只剩下一个节点.A希望最后的节点权值尽可能大,B希望尽可能小,求这个最后的值.数据保证n<=50. 这道题真的是博弈好题啊-(感觉放到ACM很合适啊) 我们考虑第一次A会如何选

topcoder srm 320 div1

problem1 link 两个数字后面都有阶乘符号,可以抵消. import java.util.*; import java.math.*; import static java.lang.Math.*; public class ExtraordinarilyLarge { public String compare(String x, String y) { boolean both=false; while(x.endsWith("!")&&y.endsWit