Demo entry 6688068

1

   

Submitted by anonymous on Jan 02, 2018 at 01:44
Language: C++. Code size: 2.6 kB.

/*
2.5h
学习一下怎么用STL的set和string
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<string>
using namespace std;
typedef struct
{
    string name;
    double avr;    //出现次数的平均值,注意要定义为double型
    int num;       //记录不同标签的数目
}NODE;
NODE p[100];
set<int> num;   //set可以用来快速检索,所以用来判重应该挺好用的
set<int>::iterator it;  //it是set的迭代器

bool cmp1(NODE a, NODE b)
{
    return a.num > b.num;
}

bool cmp2(NODE a, NODE b)
{
    return a.avr < b.avr;
}

int main()
{
    int n, sum, temp;
    char ch;
    char name[9];
    while(scanf("%d", &n)!=EOF)
    {
        ch = getchar();     ///注意吸收回车,不然结果会出现一些空行,导致PE
        for(int i = 0; i < n; i++) {
            int j = 0;
            while(scanf("%c", &name[j]) && name[j] != ' ')
                j++;
            name[j] = '\0';
            p[i].name = name;
            scanf("%d", &sum);  //sum是每个人标签的总数(包括重复的)
            int cnt = 0;    //cnt用来记录每个人不同标签的数目(不包括重复的)
            num.clear();    //每次都要把set清空
            for(j = 0; j < sum; j++) {
                scanf("%d", &temp);
                it = num.find(temp);    //it为此时num这个set查找后的键值迭代器的位置
                //元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。
                //因此当it等于num.end()时说明不存在这个数,利用这个可以来判重
                if(it == num.end()) {
                    cnt++;
                    num.insert(temp);
                }
                //如果该数已经存在则不需要处理
            }
            ch = getchar();     ///注意吸收回车,不然结果会出现一些空行,导致PE
            p[i].avr = sum*1.0 / cnt;   //标签出现次数平均值 = 标签的总数 / 不同标签的数目(不是很理解)
            p[i].num = cnt;
        }
        sort(p, p+n, cmp1);
        /*
        for(int i = 0; i < n; i++) {
            cout<<p[i].name;
            cout<<' ';
            cout<<p[i].num;
            cout<<' ';
            cout<<p[i].avr<<endl;
        }
        */

        //查看有无num值相同的,如果有,按avr值去排序
        for(int i = 0; i < n; ) {
            int flag = p[i].num;
            int j = i+1;
            while(p[j].num == flag)
                j++;
            sort(p+i, p+j, cmp2);
            i = j;
        }
        ///若要用printf输出string,要用到string的成员方法c_str(),作用是返回字符串的首字符地址
        if(n == 0) {
            printf("- - -\n");
        }
        else if(n == 1) {
            printf("%s - -\n", p[0].name.c_str());
        }
        else if(n == 2) {
            printf("%s %s -\n", p[0].name.c_str(), p[1].name.c_str());
        }
        else {
            printf("%s %s %s\n", p[0].name.c_str(), p[1].name.c_str(), p[2].name.c_str());
        }
    }

    return 0;
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).