UVa 1585 Score / 1586 Molar Mass(遍历+计数)

UVa 1585 Score

原题地址

https://vjudge.net/problem/UVA-1585

题意:给定由O和X组成的串,统计得分。每个O的得分为目前连续出现的O的个数,X得分为0,如OOXXOXXOOO=1+2+0+0+1+0+0+1+2+3=10。

解题思路

本题是《算法竞赛入门经典》的习题3-1,大水题。

遍历输入字符串,用seq记录目前连续出现的O的个数,seq=0代表没有遇到O。遇到O则按照规则累加,遇到新的X则重置seq。

AC代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

int main()
{
    int kase;
    char str[100];
    scanf("%d", &kase);
    while(kase--)
    {
        scanf("%s", str);
        int seq = 0, sum = 0;
        for (int i = 0; i<strlen(str); ++i)
        {
            if (str[i] == 'O')
            {
                sum += seq+1; //每次加之前的连续O个数和自己
                seq++; //更新连续O数
            }
            else if (str[i] == 'X' && seq) //刚遇到X
                seq = 0;
        }
        printf("%d\n", sum);
    }
    return 0;
}

UVa 1586 Molar Mass

原题地址

https://vjudge.net/problem/UVA-1586

题意:求只含C/H/O/N四种元素的分子的摩尔质量。

解题思路

本题是《算法竞赛入门经典》的习题3-2,大水题。

遍历字符串,分为以下几种情况:

  1. 遍历到元素,用pre字符记录这个元素,同时记这个元素出现次数preCount为1(因为有可能后缀数字不出现)。
  2. 遍历到数字,取出这整个数字,记录到preCount里。
  3. 每次遍历到新的字母都将前一个元素的分子量累加到sum里。可以与1合并。
  4. 最后记得累加最后一个元素的分子量。

AC代码

#include <stdio.h>
#include <string.h>
#include <cctype>
#include <map>
using namespace std;

int main()
{
    map<char, double> chem;
    chem['C'] = 12.01; chem['H'] = 1.008;
    chem['O'] = 16.00; chem['N'] = 14.01;
    chem['#'] = 0.00;
    int T;
    char str[100];
    scanf("%d", &T);
    while(T--)
    {
        scanf("%s", str);
        double sum = 0;
        int i = 0, preCount = 0;
        char pre = '#'; //起始符
        while (i < strlen(str))
        {
            if (isalpha(str[i])) //遇到新的字母
            {
                if(pre != '#') //将之前的摩尔质量累加
                    sum += chem[pre] * preCount;
                pre = str[i]; //记录该字母
                preCount = 1; //该字母出现至少一次
            }
            if (isdigit(str[i])) //遇到字母后的数字
            {
                //取出这个数字
                preCount = str[i] - '0';
                while (isdigit(str[i+1]))
                {
                    preCount *= 10;
                    preCount += str[++i]-'0';
                }
            }
            ++i;
        }
        sum += chem[pre] * preCount;
        printf("%.3f\n", sum);
    }
    return 0;
}
posted @ 2017-04-11 19:50  Lecholin  阅读(155)  评论(0编辑  收藏  举报