1. 程式人生 > >HDU 1004(順便補充map的用法)

HDU 1004(順便補充map的用法)

          if (a[k].num>max)
                    {
                        max = k;
                    }

這裡直接存的是max是k的值
應該是存max,num最大的值
然後存關於這個s所在的位置正解應該是

if (a[k].num>max)
                    {
                        max = a[k].num;
                        ans=k;
                    }

AC過的程式碼但是就是很奇怪了,我自己測試的時候會出現問題
比如
輸入
5
red
red
blue
blue
blue
輸出
red
這也能ac就是很奇怪了

恩這道題的正解應該用map來寫就會很方便了。

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
struct color{
    int num=0;
    string cc;
};
color a[10001];

int main()
{
    //freopen("t.txt","r",stdin);
int n, m; string s; while (cin >> n&&n) { bool em; int k; //memset(a, 0, sizeof(a)); int j = 0; int max = 0; int ans=0; for (int i = 0; i < n; i++) { cin >> s; em = true; if
(i == 0) { a[0].cc = s; a[0].num++; j++; } //判斷已有的存不存在 for (k = 0; k < j; k++) { em = true; if (s == a[k].cc) { a[k].num++; if (a[k].num>max) { max = a[k].num; ans=k; } em = false; break; } } //不存在就存下了 if (em&&k){ a[j].cc = s; a[j].num++; j++; //if (a[j].num > max) //max = j; } } cout << a[ans].cc << endl; } return 0; }

後來大佬和我說恩沒有清零num所以會這樣,但是這樣的程式碼竟然可以AC神奇;emmm

這是修改後沒問題能AC的

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
struct color{
    int num=0;
    string cc;
};
color a[10001];

int main()
{
    //freopen("t.txt","r",stdin);
    int n, m;

    string s;
    while (cin >> n&&n)
    {
        bool em;
        int k;
        //memset(a, 0, sizeof(a));
        int j = 0;
        int max = 0;
        int ans=0;

        for (int i = 0; i < n; i++)
        {
            a[i].num=0;
            cin >> s;
            em = true;
            if (i == 0)
            {
                a[0].cc = s;
                j++;
            }
            //判斷已有的存不存在
            for (k = 0; k < j; k++)
            {
                em = true;
                if (s == a[k].cc)
                {
                    a[k].num++;
                    if (a[k].num>max)
                    {
                        max = a[k].num;
                        ans=k;
                    }

                    em = false;
                    break;
                }
            }
            //不存在就存下了
            if (em&&k){

                a[j].cc = s;
                a[j].num++;
                if (a[j].num>max)
                    {
                        max = a[j].num;
                        ans=j;
                    }
                j++;
            }
        }
        cout << a[ans].cc << endl;
    }
    return 0;
}

總結一下:還是自己的邏輯不清晰。emmmm

這下面是用map寫的AC的:

//map的使用 
#include<iostream>
#include<map>
#include<string>
using namespace std; 
int main()
{
    int n;
    string s;
    int max,ans;
    while(cin>>n&&n)
    {
        map<string,int>color;//每次重新輸入重置 
        max=0;//同理如上 
        for(int i=0;i<n;i++)
        {
            cin>>s;
            color[s]++;
        }
    for(map<string,int>::iterator it=color.begin();it!=color.end();++it)
    {
        if(it->second > max) {//數字部分 
                max=it->second;
                s=it->first;
            }
    }
    cout<<s<<endl; 

    }
    return 0;
 } 

順便補充一下map的知識——以下基本來自搜狗百科emmm
map搜狗百科