Eligibility (很有STL含金量的解法)

Eligibility


其實題意很簡單,時限也不緊,直接做,也許可以過。鄙人最近在做STL,看什麼題,只要是有關字符串的,都想用STL做(當然,數據量大的還是怕會超時)。


有T組數據每組數據n行,每行2個要點,隊名 年份,表示<隊名>在<年份>參加過該比賽。參加比賽次數超過5次(包含)的,視爲不合格。要求輸出合格的隊名。每組數據都是獨立的,沒有相互的聯繫性。【隊名中可能會有空格】


開始沒有看到隊名中間有空格這個,導致輸入出錯,一直都與AC無緣。


除了隊名這裏有點鬱悶外,很多人WA的原因,是(特地改寫代碼後測試過)同一條信息可能會重複出現。也就是說同一組測試數據中可能會出現多行相同的信息(同一組在同一年參加比賽的一條信息出現多次)。


還有,輸出的時候,要求按字典序輸出。在map和set裏面是無法排序的,只能是用這些容器把數據篩選出來之後,排序後再輸出。


對此,我只想說,我們用STL吧!


該題第一次A是用的一個隊友的思想(見代碼二),因爲開始我一直TLE,以爲自己的思路出了問題,他的代碼是WA,所以用了他的代碼改的輸入。A了之後,發現自己的思想(見代碼一),也是對的,只是輸入是沒有處理空格問題。這兩個代碼都用到STL,用到容器,string之類的,但是,我的代碼容器用的更好(畢竟我是做STL的,他是做動歸的,對容器不是很熟)。



Solution User Problem Language Judge Result Memory Time Used Code Length Submit Time
90375 20114045007 11410 GNU C++ Accepted 1232KB 78ms 1005B 2013-10-08 10:04:15.0
89789 20114045007 11410 GNU C++ Accepted 1292KB 156ms 1896B 2013-10-07 15:01:51.0


不同的思維,效率也有所不同,比起一般的思維來說,STL的更省篇幅,省時間,沒想到還省內存了!呵呵大笑


這裏僅分析自己的思維的代碼!


【代碼一】

1、數據結構:

(1)map<string ,set<string> >ms;     //嵌套容器。

        表示<隊名>string參加了set裏面所有年份的比賽(比賽的場數就是set.size())。

         不必擔心信息重複問題,因爲set不允許插入相同的關鍵字(直接屏蔽曾經出現過的年份)。

        後面爲了測試證明測試數據中同一條信息會重複出現,特地改成了map<string ,multiset<string> >ms;結果WA了(2)priority_queue<string ,vector<string>,greater<string> > pq;   //值小優先的優先隊列

        符合輸出條件的隊伍的隊名篩選出來後,存入優先隊列形成字典序後,直接輸出即可


2、處理步驟:

(1)輸入信息,並處理(主要是處理隊名中的空格問題,直接截取即可)

(2)將信息壓入容器:ms[<隊名>].insert(<年份>)

(3)篩選信息,定義迭代器map<string,set<string> >::iterator it;一次訪問容器中隊伍的信息,遇到it->second.size()<5的就將其關鍵字it->first壓入到優先隊列中備用

(4)將優先隊列中所有的信息全部輸出即可(不用擔心字典序哦,優先隊列早就排好了)


#include<stdio.h>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int t,n;
    int i=0;
    char a[40];
    map<string,set<string> > ms;
    scanf("%d",&t);
    while(t--)
    {
        ms.clear();
        scanf("%d",&n);
        getchar();
        while(n--)
        {
            gets(a);
            string s=a;
            int str=s.size();
            while(s[str-1]==' '&&str--);
            ms[s.substr(0,str-5)].insert(s.substr(str-4,4));
        }
        i++;
        printf("Case #%d:\n",i);
        priority_queue<string ,vector<string>,greater<string> > pq;
        map<string,set<string> >::iterator it;
        for(it=ms.begin();it!=ms.end();it++)
            if(it->second.size()<5) pq.push(it->first);
        while(!pq.empty()) printf("%s\n",pq.top().c_str()),pq.pop();
    }
    return 0;
}

【代碼二】

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

string ss[510];
int cnt,r=1;

struct node
{
    string a;
    string b;
}list[510];

bool cmp(node x,node y)
{
    if(x.a==y.a)return x.b<y.b;
    return x.a<y.a;
}

int main()
{
    int T;
    int i,j,n,year,ans;
    string str;
    map<string,int>cp;

    scanf("%d",&T);

    while(T--)
    {
        scanf("%d",&n);
        getchar();

        for(i=1;i<=n;i++)
        {
            char x[100];
            gets(x);
            list[i].a=x;
            int str1=list[i].a.size();
            while(x[str1-1]==' '&&str1--);
            list[i].b=list[i].a.substr(str1-4,4);
            list[i].a=list[i].a.substr(0,str1-5);
        }

        sort(list+1,list+n+1,cmp);

        ans=0;
        cp.clear();

        for(i=1;i<n;i++)
        {
            if(list[i].a==list[i+1].a &&list[i].b == list[i+1].b)
            else cp[list[i].a]++;
        }

        cp[list[i].a]++;
        map<string,int>::iterator it;
        cnt = 0;

        for(it = cp.begin();it!=cp.end();it++)
        {
            if(it->second>=1 && it->second<5)
                ss[cnt++] = it->first;
        }

        sort(ss,ss+cnt);

        printf("Case #%d:\n",r++);

        for(i=0;i<cnt;i++) cout<<ss[i]<<endl;
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章