题解 P3880 【[JLOI2008]提示问题】

这个题目的难度似乎有点难啊!!!

提示1很简单,只需要把字母转为.,空格以及其他字符还是其他字符

提示2的难度稍稍增加,但也难不过我们!我们先找到三分之一,四舍五入用round

提示3是最坑人的,难啊!先要在提示2记录下来三分之一的最后一个字符所在的下标,提示3从下表这里开始往后找元音,找得到那就先把三分之一以内输出,再把后面的元音输出,不然就是三分之二以内输出!

代码,20ms,跑的飞快:

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

string s;

double cnt = 0;
int pos, xpos;

void one(string s)
{
    for(string::iterator it = s.begin(); it != s.end(); ++it)
    {
        if(*it == ' ')
        {
            printf(" ");
        }
        else if(isalpha(*it))
        {
            printf(".");
            cnt++;
        }
        else
        {
            printf("%c", *it);
        }
    }
    puts("");
}

void two(string s)
{
    pos = round(cnt / 3);
    int len = s.length() - 1;
    int count = 0;
    for(int i = 0; i <= len; i++)
    {
        if(isalpha(s[i]))
        {
            count++;
            if(count == pos + 1)
            {
                xpos = i;
            }
            if(count <= pos)
            {
                printf("%c", s[i]);
            }
            else
            {
                printf(".");
            }
        }
        else
        {
            printf("%c", s[i]);
        }
    }
    puts("");
}

void three(string x)
{
    int len = x.length() - 1, count = 0;
    string s = x;
    transform(s.begin(), s.end(), s.begin(), ::toupper);//全部转为大写
    bool flag = false;
    for(int i = xpos + 1; i <= len; i++)
    {
        if(s[i] == 'A' || s[i] == 'E' || s[i] == 'I' || s[i] == 'O' || s[i] == 'U')
        {
            flag = true;
            break;
        }
    }
    if(flag)
    {
        int f = 0;
        for(int i = 0; i <= len; i++)
        {
            if(count == pos && isalpha(x[i]))
            {
                f = i;
                break;
            }
            else if(isalpha(x[i]))
            {
                count++;
                if(count <= pos)
                {
                    printf("%c", x[i]);
                }
                else
                {
                    printf(".");
                }
            }
            else
            {
                printf("%c", x[i]);
            }
        }
        for(int i = f; i <= len; i++)
        {
            if(x[i] == 'a' || x[i] == 'e' || x[i] == 'i' || x[i] == 'o' || x[i] == 'u' || x[i] == 'A' || x[i] == 'E' || x[i] == 'I' || x[i] == 'O' || x[i] == 'U')
            {
                printf("%c", x[i]);
            }
            else
            {
                if(isalpha(x[i]))
                {
                    printf(".");
                }
                else
                {
                    printf("%c", x[i]);
                }
            }
        }
    }
    else
    {
        int spos = round(cnt / 1.5), cnts = 0;//除以1.5就是三分之二
        for(int i = 0; i <= len; i++)
        {
            if(isalpha(x[i]))
            {
                cnts++;
                if(cnts <= spos)
                {
                    printf("%c", x[i]);
                }
                else
                {
                    printf(".");
                }
            }
            else
            {
                printf("%c", x[i]);
            }
        }
    }
}

int main()
{
	getline(cin, s);
	one(s);
	two(s);
        three(s);
	return 0;
}

加上内存排名第一哦!

posted @   HappyBobb  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示