POJ 1002 487-3279

POJ 1002 487-3279

POJ 1002一直WA,都要疯了。。。
题意就是输入几组字符串,按照给出的形式转换为统一格式,然后输出出现多于一次的字符串出现的次数,输出时按照升序排列。很简单,但是做的很郁闷,一直WA
贴个代码纪念,下边是AC的代码~~~

 

  1 #include < iostream >
  2 #include < vector >
  3 #include < string >
  4 #include < algorithm >
  5 using   namespace  std;
  6 int  deal( char  c)
  7 {
  8    int n;
  9switch(c)
 10{
 11case'A':
 12case'B':
 13case'C':
 14    n=2;break;
 15case'D':
 16case'E':
 17case'F':
 18    n=3;break;
 19case'G':
 20case'H':
 21case'I':
 22    n=4;break;
 23case'J':
 24case'K':
 25case'L':
 26    n=5;break;
 27case'M':
 28case'N':
 29case'O':
 30    n=6;break;
 31case'P':
 32case'R':
 33case'S':
 34    n=7;break;
 35case'T':
 36case'U':
 37case'V':
 38    n=8;break;
 39case'W':
 40case'X':
 41case'Y':
 42    n=9;break;
 43
 44}

 45return n;
 46}

 47 int  main()
 48 {
 49    int n,i,j,base=1000000,count=1,result=1;
 50    int yoyo=0;
 51    long int sum=0;
 52    string s;
 53    vector<long int>v;
 54    cin>>n;
 55    for(i=0;i<n;i++)
 56    {
 57        cin>>s;
 58        for(j=0;j<s.length();j++)
 59        {   if(base<1)break;
 60            if(s[j]=='-')continue;
 61            if(s[j]>=48&&s[j]<=57)
 62            {
 63            sum+=base*(s[j]-'0');
 64            base/=10;
 65            }

 66            if(s[j]>='A'&&s[j]<='Z')
 67            {
 68                sum+=base*deal(s[j]);
 69                base/=10;
 70            }

 71
 72        }

 73        v.push_back(sum);
 74        sum=0;
 75        base=1000000;
 76        s.empty();
 77    }

 78    sort(v.begin(),v.end());
 79    
 80/**//*
 81
 82    for(i=0;i<n;i++)
 83    {
 84        for(j=i+1;j<n;j++)
 85        {
 86            if(v[j]==v[i])
 87            {
 88                count++;
 89                continue;
 90            }
 91            
 92                break;
 93        }
 94        if(count)
 95        {
 96            cout<<(v[i]/10000)<<"-"<<(v[i]%10000)<<" "<<count+1<<endl;
 97            result=1;
 98        }
 99        i=j;
100        count=0;
101
102    }
103    if(result==0)cout<<"No duplicates."<<endl;
104    */

105
106
107
108    result=1;
109    for(i=1;i<n;i++)
110    {
111        if(v[i]==v[i-1])
112            count++;
113        if(count>1&&v[i]!=v[i-1])
114        {
115//cout<<(int)(v[i-1]/10000)<<"-"<<(v[i-1]%10000)<<" "<<count<<endl;
116        printf("%03d-%04d %d\n", v[i-1]/10000, v[i-1]%10000, count);
117        count=1;
118        result=0;
119        }

120    }

121    if(v[i-1]==v[i-2]&&count>1)
122    {
123//cout<<(int)(v[i-1]/10000)<<"-"<<(v[i-1]%10000)<<" "<<count<<endl;
124        printf("%03d-%04d %d\n", v[i-1]/10000, v[i-1]%10000, count);
125        result=0;
126    }

127    if(result)cout<<"No duplicates. "<<endl;
128}

129

 效率不高,勉强可以AC
其中deal函数可以优化的
被屏蔽的是原来WA的代码(替换108-127的部分),不过还是不知道是怎么错的,sample和在看到的几组测试数据都没有问题,各位有看出来的要留言告诉我哈 kaka
偶发现一个问题:用第115行的cout代替printf,提交的结果就是WA,将116行换成
cout<<(int)(v[i-1]/10000)<<"-"<<(v[i-1]%10000)<<" "<<count<<endl;以后还是WA
觉得有点诡异

最近总遇到觉得诡异的程序,可见自己还是基础太差,得多看看书啦 kaka~~~ 

你可能感兴趣的:(POJ 1002 487-3279)