Day 0x1D UVa10226 Hardwood Species

题意

  • 输入树名,输出各树种占的比例
  • 需要注意的有:
    1. 第一行输入正整数 n 代表测资数
    2. 每笔输入及输出之间皆有空白行
    3. 每行输入代表一颗树,树名不超过 30 个字元;树种不超过 10000;数量不超过 1000000
    4. 输出按照字典序,经过排序後的树名及比例 (小数点後四位)

解法

  • 输入代表测资数的整数 n,两次 getchar() 分别滤掉换行与空白行,再开始用 while 回圈重复输入
    int n;
    
    scanf("%d", &n);
    getchar();
    getchar();
    
    while(n--){
        ...
    }
    
  • 因为 1000000 X 31 的阵列太大,所以宣告成全域变数,因此每次都要记得先清空阵列;之後再用 for 回圈读入树名直到空白行 (输入後仍为 0);同时计算共有多少颗树,存到 num 里面
    int num = 0;
    
    for(i = 0; i < 1000000; i++){
        memset(name[i], 0, 31);
    }
    
    for(i = 0; ;){
        gets(name[i]);
        if(name[i][0] == 0){
            break;
        }
        else{
            i++;
            num++;
        }
    }
    
  • 虽然一样是按照字典序排序,但是不能像 Day 0x1C UVa10420 List of Conquests 写成泡沫排序,所以使用 qsort() 来加速
    int compare(const void * a, const void * b){
    
        int flag = strcmp(a, b);
    
        if(flag > 0){
            return 1;
        }
        else if(flag < 0){
            return -1;
        }
        else{
            return 0;
        }
    
    }
    int main(){
        ...
        qsort (name, num, 31, compare);
        ...
    }
    
  • 输出时和 Day 0x1C UVa10420 List of Conquests 同概念,使用 flag 的状态来决定是否输出与计算次数;要小心输出型态是四位数与测资间的空白行
    for(i = 0; i < num;){
        if(!flag){
            printf("%s ", name[i]);
            flag = true;
            count++;
        }
        else{
            if(i + 1 != num && strcmp(name[i], name[i + 1]) == 0){
                count++;
            }
            else{
                printf("%.4lf\n", ((double)count / (double)num) * 100);
                flag = false;
                count = 0;
            }
            i++;
        }
    }
    
    if(n){
        printf("\n");
    }
    
  • C code
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<stdbool.h>
    
    char name[1000000][31];
    
    int compare(const void * a, const void * b){
    
        int flag = strcmp(a, b);
    
        if(flag > 0){
            return 1;
        }
        else if(flag < 0){
            return -1;
        }
        else{
            return 0;
        }
    
    }
    
    int main(){
    
        int n;
        int i, j;
    
        scanf("%d", &n);
        getchar();
        getchar();
    
        while(n--){
    
            char temp[31] = {0};
            int num = 0;
            bool flag = false;
            int count = 0;
    
            for(i = 0; i < 1000000; i++){
                memset(name[i], 0, 31);
            }
    
            for(i = 0; ;){
                gets(name[i]);
                if(name[i][0] == 0){
                    break;
                }
                else{
                    i++;
                    num++;
                }
            }
    
            qsort (name, num, 31, compare);
    
            for(i = 0; i < num;){
                if(!flag){
                    printf("%s ", name[i]);
                    flag = true;
                    count++;
                }
                else{
                    if(i + 1 != num && strcmp(name[i], name[i + 1]) == 0){
                        count++;
                    }
                    else{
                        printf("%.4lf\n", ((double)count / (double)num) * 100);
                        flag = false;
                        count = 0;
                    }
                    i++;
                }
            }
    
            if(n){
                printf("\n");
            }
        }
    
        return 0;
    }
    
  • C++
    • 神奇的 map 又登场了,要注意输出格式即可
    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
    
        int n;
        bool flag = false;
        string name;
    
        cin >> n >> ws;
        // 这几种方法都行,滤掉多余换行
        // cin.get();
        // cin.ignore();
        // getline(cin, name);
    
        while(n--){
    
            if(flag){
                cout << "\n";
            }
    
            flag = true;
            double sum = 0;
            map<string, int> mp;
    
            while(getline(cin, name) && name != ""){
                mp[name]++;
                sum++;
            }
    
            for (auto i: mp){
                cout << i.first << " " << fixed << setprecision(4) << (i.second / sum) * 100 << "\n";
            }
        }
    
        return 0;
    }
    

<<:  企划实现(15)

>>:  第15天~Spinner

第8车厢-抖动画面流出!你真的会:hover吗?

本篇介绍版面使用:hover会遇到的雷点,以及提供解决方式参考 还记的,我们在第6篇有提到状态选择...

Day.6 留个纪录好办事 - Mysql Log (日志纪录)-下

上一篇介绍的日志纪录主要用来找错误与优化改善问题方面,而今天的日志内容会跟MYSQL数据恢复&am...

[Day12]加密方式

Hi~今天要介绍加密方式,如果有兴趣的话,就继续看下去吧! 在这个方面其实加密做得十分缜密!很多学...

Material UI in React [DAY 1] 简介

因为工作的关系,在专案上接触到Material UI的Framework,也让我理解到为什麽这套UI...

Day7 Redis组态档设定-REPLICATION

Redis.config REPLICATION replicaof 透过非同步方式进行Master...