Codeforces 291B题解

Codeforces 291B题解

题目

今天是用Ubuntu写的Blog,这个系统是我用来做AOSP P适配用的,顺手装了个CLion写题,懒得装截图软件,就这样将就着用用吧。
原题链接


题意

本题是一道模拟题,模拟类Linux终端中命令行参数读取功能。在两个"之间或是两个(空格)之间的就是命令行参数。我们的任务就是从输入流中提取出参数并用一对<>包起来换行输出。


代码

  • 解法一
    #include <bits/stdc++.h>
     
    using namespace std;
     
    int main() {
        vector<char> str;
        char temp;
        do{
            temp=getchar();
            str.push_back(temp);
        }
        while (temp!='\n');
        int i,flag=0,flag2=0,flag3=0;
        for (i=0;i<str.size();i++)
        {
            if ((flag%2&&flag3%2==0||flag3%2&&flag%2==0)&&!flag2)
            {
                putchar('<');
                flag2=1;
            }
            else if ((flag3%2==0&&flag%2==0)&&flag2)
            {
                flag2=0;
                cout<<'>'<<endl;
            }
            if (str[i]=='"')
            {
                flag++;
            }
            else if (isspace(str[i])&&!isspace(str[i+1])&&(!(flag3%2))&&flag%2==0&&str[i+1]!='"')
            {
                flag3++;
            }
            else if (!isspace(str[i-1])&&isspace(str[i])&&(flag3%2)&&flag%2==0&&str[i-1]!='"')
            {
                flag3++;
                if (!isspace(str[i+1])&&str[i+1]!='"')
                {
                    cout<<'>'<<endl;
                    flag2=0;
                    flag3++;
                }
            }
            else if(flag%2||flag3%2)
            {
                putchar(str[i]);
            }
            else if (!isspace(str[i])&&str[i]!='"'&&i==0)
            {
                putchar('<');
                flag2=1;
                cout<<str[i];
                flag3++;
            }
            else if (!isspace(str[i])&&str[i]!='"'&&str[i+1]=='\n')
            {
                flag2=0;
                cout<<'>'<<endl;
            }
        }
        return 0;
    }
  • 解法二

还有一种用vector做的方法,思路是先将所有的输入存起来,再判断开头是什么,如果是字母就带上<输出,不是就先输出<,再将这个erase掉,如果下一个还不是有效字符如"或非空格字符前的空格,就一直erase,直到遇上有效字符,就输出。到倒数第二个字符后,由于最后一个字符我设定是\n,所以直接cout<<THAT_CHAR<<endl即可。
这个思路因为我已经做出了第一个方法,而且觉得并没有在复杂度上太占优势,只是比较简单,所以没有写成代码,不过能想到另一条路也还是蛮好的。


思路

解法一的思路是分三种情况讨论,"型和型或是A/A型,第三种我是在第二种的基础上改进的,主要是判断第一个是空格还是有效字符来判断类型,第一种类型判断比较简单,第二种要注意夹在两个命令行变量之间的空格是需要复用的。然后在整体上要注意三种类型的耦合,一步想错整体输出就会出错,这个方法比较复杂,在这种思路明确且考虑情况比较少的情况下可以使用,但是在情况复杂多变的时候就不行了,代码的耦合度最好低一些,无论是不是做大型项目。


总结

本题2000分,第一次在Linux环境下写题,虽然是较为简单的模拟、字符串题,我比较擅长模拟和字符、字符串类型的题目,所以下个阶段我的重心要转移到做没怎么做过的DP题上。
在编程软件方面,Xcode是当之无愧的最好用的编译器(在我个人看来),CLion虽然也有自己的特色,也还算好用,但是我还是更喜欢我MBP上的Xcode。至于Codelocks,它除了开源免费外一无是处,叫做BugBlocks我觉得更合适(手动滑稽),但是比赛要用也没办法,咬着牙用喽(Dev-C++的调试功能真的窒息,也不好用)。
PS:最近想搞搞Android P适配教程来练习一下自己的MarkDown,虽然我在Github上的项目还是比不上Github上的高产大佬们,但是我还是想试着整理一下这从Android N到P的适配历程,嘿嘿。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值