yoyouhappy的秘密花园
欢迎来到我的秘密花园^^
posts - 16,comments - 33,trackbacks - 0

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

 

  1#include<iostream>
  2#include<vector>
  3#include<string>
  4#include<algorithm>
  5using namespace std;
  6int 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}

 47int 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~~~ 

posted on 2007-08-06 20:50 yoyouhappy 阅读(3128) 评论(6)  编辑 收藏 引用 所属分类: yoyo的解题报告acm/icpc学习笔记

FeedBack:
# re: POJ 1002 487-3279
2007-08-07 10:30 | 若弱
你这样处理的话,效率有点低哦。
你应该用一个hashmap来归并字符串的个数,弄完之后用hash sort来排序,这样的速度是最快的
  回复  更多评论
  
# re: POJ 1002 487-3279
2007-08-07 12:52 | yoyouhappy
恩 我这样做确实时间耗的很多
不过 其实。。。我不知道哈希的
还得多学习哈~~~
  回复  更多评论
  
# re: POJ 1002 487-3279
2007-08-12 14:32 | lidemin
偶发现一个问题:用第115行的cout代替printf,提交的结果就是WA,将116行换成
cout<<(int)(v[i-1]/10000)<<"-"<<(v[i-1]%10000)<<" "<<count<<endl;以后还是WA
觉得有点诡异



这个好像是由于cout没有控制输出格式的问题吧 比如 如果是0000000的话 你用的 cout 应该是会输出0-0 如果我没看错的话 应该是这样的不过 你 下面用 的 printf 好像也没有控制啊 难道printf自动补0了 ??


我现在 正在做这个 WA了无数次了 不知道 原因 狂郁闷中。。。  回复  更多评论
  
# re: POJ 1002 487-3279
2007-08-16 09:15 | yoyouhappy
hehe 原来是这个原因,我没想到0的问题。。。
printf用%03和%04来控制输出格式,00000000也会输出000-0000的吧


我最近也狂WA,这几天连不上网,就断网做,感觉倒是不错,今天早晨提交了7道题竟然是
4WA+2RE+1AC。。。真是让我疯掉了  回复  更多评论
  
# re: POJ 1002 487-3279
2009-01-16 19:48 | 原版橘子皮
全用STRING就好了嘛...做一个函数读入输入的字符串,建个temp的string,遇到-就忽略,其余的替换掉添加到temp里,返回temp。然后直接输出就行了。。。用map做数据结构,自动排序好的~  回复  更多评论
  
# re: POJ 1002 487-3279
2011-03-07 09:55 | buct
那是因为前面补0的原因! 比如 9 应该是 000-0009 而不是0-9  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


Priceline Travel
Priceline Travel