杭电 HDU ACM 1800 Flying to the Mars

来源:互联网 发布:lvm安装linux 编辑:程序博客网 时间:2024/05/16 17:55

Flying to the Mars

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12471    Accepted Submission(s): 3963


Problem Description

In the year 8888,  the Earth is ruled by the PPF Empire . As the population growing , PPF needs to find more land for the newborns . Finally , PPF decides to attack Kscinow who ruling  the Mars . Here the problem comes! How can the soldiers reach the Mars ?  PPF convokes his soldiers and asks for their suggestions . “Rush … ” one soldier answers. “Shut up ! Do I have to remind you that there isn’t any road to the Mars from here!” PPF replies. “Fly !” another answers. PPF smiles :“Clever guy ! Although we haven’t got wings , I can buy some magic broomsticks from HARRY POTTER to help you .” Now , it’s time to learn to fly on a broomstick ! we assume that one soldier has one level number indicating his degree. The soldier who has a higher level could teach the lower , that is to say the former’s level > the latter’s .  But the lower can’t teach the higher. One soldier can have only one teacher at most , certainly , having no teacher is also legal. Similarly one soldier can have only one student at most while having no student is also possible. Teacher can teach his student on the same broomstick .Certainly , all the soldier must have practiced on the broomstick before they fly to the Mars!  Magic broomstick is expensive !So , can you help PPF to calculate the minimum number of the broomstick needed .
For example :
There are 5 soldiers (A B C D E)with level numbers : 2 4 5 6 4;
One method :
C could teach B; B could teach A; So , A B C are eligible to study on the same broomstick.
D could teach E;So D E are eligible to study on the same broomstick;
Using this method , we need 2 broomsticks.
Another method:
D could teach A; So A D are eligible to study on the same broomstick.
C could teach B; So B C are eligible to study on the same broomstick.
E with no teacher or student are eligible to study on one broomstick.
Using the method ,we need 3 broomsticks.
……

After checking up all possible method, we found that 2 is the minimum number of broomsticks needed.
 

Input
Input file contains multiple test cases. 
In a test case,the first line contains a single positive number N indicating the number of soldiers.(0<=N<=3000)
Next N lines :There is only one nonnegative integer on each line , indicating the level number for each soldier.( less than 30 digits);
 

Output
For each case, output the minimum number of broomsticks on a single line.
 

Sample Input
410203004523434
 

Sample Output
12
 

Author
PPF@JLU
 
题意是递增或递减字符串一共多少 本质是相同数字最多多少。
今天在网上遇到了一个大神 ,特别服气。我提交八次都非法访问内存,就是不知道数组怎么越界。其实 注意题目是30digits ,即最大位数。开辟一般数组肯定内存超限。
所以用hash。不过仍然可以用int定义变量,因为再大的数 都可以通过哈希函数唯一 映射到哈希表里,因为当读入的数据超过int时变为负数,hashh首先要处理这个负数。
因为不能作为下面语句的下标。这题目测试数据有个水的地方,那就是当读入的多个int溢出数的时候num只截取后32位。然后就可能出现两个不同的数有相同的关键值。那么就当做了相同的数来处理。(我说即使超界int也不影响结果,但是大神敏锐的就立马反驳了我,指出了读入num的特殊情况)。
那么第二种方法用map<int,int>ls;也可能存在相同的问题。
AC 1:
#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>const int  M=6005;using namespace std;int ls[M],gq[M];int hashh(int k){    int t=k;    t=(t%M+M)%M;    if(ls[t]!=0&&gq[t]!=k)    {        t=(t+1)%M;    }    return t;}int main(){ int num,n; while(cin>>n) {     memset(ls,0,sizeof(ls));     memset(gq,0,sizeof(gq));          for(int i=0;i<n;i++)     {         scanf("%d",&num);         int p=hashh(num);         gq[p]=num;         ls[p]++;     }    sort(ls,ls+M);    cout<<ls[M-1]<<endl; } return 0;}
AC map1:
#include<iostream>#include<map>#include<stdio.h>using namespace std;int main(){    map<int,int>ls;    int n,gq;    while(cin>>n)    {        ls.clear();        int maxx=0;        for(int i=0;i<n;i++)        {            scanf("%d",&gq);            ls[gq]++;        }        for(map<int,int>::iterator it=ls.begin();it!=ls.end();it++)        {            maxx=max(maxx,it->second);        }            cout<<maxx<<endl;    }    return 0;}
这样做超时。
#include<iostream>#include<string>#include<map>#include<algorithm>using namespace std;int main(){    int n,M=0;    while(cin>>n)    {        string str;        map<string,int>ls;        for(int i=0;i<n;i++)        {            cin>>str;            ls[str]++;            str.clear();        }         M=0;        for(map<string,int>::iterator it=ls.begin();it!=ls.end();it++)            M=max(M,it->second);            cout<<M<<endl;    }}

其实上个方法 看起来挺完美 TL;
 其实还有一中字符串hash但是不会,以后如果学了的话再加上!


额………… 博客的好处就在这 随时可以回头看……  今天学了字符串hash 并刚刚参考网上实现文件头自定义作者信息
/*=============================================================================##      Author: liangshu - cbam ##      QQ : 756029571 ##      School : 哈尔滨理工大学 #     Last modified: 2015-08-07 23:40## Filename: xianduanshu.cpp## Description: #=============================================================================*/#include<iostream>  #include<sstream>  #include<algorithm>  #include<cstdio>  #include<string.h>  #include<cctype>  #include<string>  #include<cmath>  #include<vector>  #include<stack>  #include<queue>  #include<map>  #include<set>  using namespace std; const int INF = 7003;inline int ELFhash(char *key){    unsigned long h = 0;    unsigned long g;    while(*key){        h = (h<<4) + *key++;        g = h & 0xf0000000L;        if(g) h ^= g>>24;        h &= ~g;    }    return h;}int Hash[INF],num[INF];int ans, n; inline void Hashans(char *str){    int k, t;    while(*str == '0')        str++;        k = ELFhash(str);cout<<"k = "<<k<<endl;    t = k % INF;//cout<<"t = "<<t<<endl;    while(Hash[t] != -1 && Hash[t] != k){        t = (t + 10) % INF;    }        if(Hash[t] == -1)        {            Hash[t] = k;num[t]++;        }        else if( ++num[t]>ans ){            ans = num[t];//cout<<"ans = "<<ans<<endl;                }    }int main(){    char str[100];    while(scanf("%d", &n) != EOF){        memset(Hash, -1, sizeof(Hash));        memset(num, 0, sizeof(num));        getchar();ans = 1;        for(int i = 0; i < n; i++){            gets(str);//cout<<"sdj"<<endl;            Hashans(str);        }        printf("%d\n", ans );    }    return 0;}


0 0