• 【ZZNU-oj-2116:人间不值得】(1亿以内的货币拼音转数值求折扣价原价)--hash+String大法好+字符串处理+超大暴力模拟题


    B : 人间不值得

    Progress Bar

    时间限制:1 Sec 内存限制:256 MiB
    提交:146 答案正确:12

    提交 编辑

    题目描述

    家缠万贯来几时,我今停杯一问之。人攀暴富不可得,贫穷却与人相随。何以解忧,唯有暴富。spring做梦都想暴富,但是又苦于囊中羞涩。每次消费都会精打细算,所以每次消费都会记在小本本上。可惜spring是个汉字盲,你能帮他来完成汉字拼音转化为数字么。spring每次的消费都是一行格式表示分别为原价(或折扣价) 价格   折扣度   的拼音形式展开。   拼音中不包含汉字“两”的拼音,只有汉字“二”的拼音。

    输入

    输入一行  共有三个字符串,分别代表 原价(折扣价)拼音  和 价格拼音 以及 折扣度拼音,表示spring每次的消费。

    其中 价格拼音转化成数字不超过1亿元,价格拼音的组成符合我们日常的叫法,如5010 五千零十元。折扣度拼音转化成汉字将不多于五个汉字,如六七折,一二三四折等,不存在零折,但可能存在零一折等。数字都是正整数。

     

    输出

    来帮他完成汉字拼音转化,spring需要你。求出 原价为多少钱,以及折扣价为多少,两者中间保留空格,保留两位有效数字。占一行。

    样例输入

    复制
    yuanjia erbaiyuan wuzhe
    zhekoujia yibaiyuan wuzhe

    样例输出

    复制
    200.00 100.00
    200.00 100.00

    提示


    思路:1、构造拼音到数值的has表,处理冲突的“qi”和“qian”,“ba”和“bai”。

      2、String类的find()函数是个好东西,直接找到对应的子字符串,然后换成“Qi”和“qIan”,“Ba”和“bAi”

      3.int d[]表示偏移量数组,find(“子字符串”)返回-1表示没有结果,其余表示可以找到,然后向后偏移d【i】位,d[i]其实等于当前子字符串的长度;还有在偏移一段后,要将刚刚找到的字符串抹掉——全部变成“*******”号!

      4、其余的问题,慢慢调试,建议在关键循环中加上printf调试!

      5、删掉末尾的 yuan, s.erase(x,4); 特判1亿元等等细节方便解决问题!

      6、尽情暴力即可,相信自己,问题规模不大,没有简单的方法,只管暴力!所谓“能力”,就是这么硬着发麻的头皮一步一步地锻炼出来的!


    题解:(建议,好的学习方法是借鉴下别人的思路,自己进行大胆尝试解决,能自己跑多远就跑多远;出现问题再回去找找,一味地照搬没多大意义)

      

      1 #include <iostream>
      2 #include<stdio.h>
      3 #include<string.h>
      4 #include<string>
      5 #include<algorithm>
      6 #define ll long long
      7 using namespace std;
      8 #define N 100
      9 char arr[20][10]= {"ling","yi","er","san","si","wu","liu","Qi","Ba","jiu",
     10                    "shi","bAi","qIan","wan"
     11                   };  //0~9 + 10~13
     12 int has[]= {0,1,2,3,4,5,6,7,8,9,10,100,1000,10000,100000000}; //has[14]为亿
     13 int d[]= {4,2,2,3,2, 2,3,2,2,3, 3,3,4,3}; //偏移量
     14 int solve(char sn[])
     15 {
     16 
     17     string s(sn);
     18     int x,len=s.length();
     19 
     20 
     21     while(x=s.find("qi"),x>=0&&x<len)  //替换qi 和 qian
     22     {
     23         if(x+2<=len-1&&s[x+2]!='a')
     24             s[x]='Q';
     25         else if(x+2>=len)
     26             s[x]='Q';
     27         else
     28             s[x+1]='I';
     29     }
     30     while(x=s.find("ba"),x>=0&&x<len)  //替换Ba 和 bAi
     31     {
     32         if(x+2<=len-1&&s[x+2]!='i')
     33             s[x]='B';
     34         else if(x+2>=len)
     35             s[x]='B';
     36         else
     37             s[x+1]='A';
     38     }
     39     x=s.find("yuan");  //删掉末尾的 yuan
     40     if(x>=0&&x<len)
     41         s.erase(x,4);
     42     // cout<<s<<" ~~删减yuan后~"<<endl;
     43     //特判1亿元
     44     x=s.find("yiyi");
     45     if(x>=0&&x<len)
     46         return has[14];
     47 
     48     x=0;
     49     len=s.length();
     50     int sum=0,ss=0;
     51     while(x<len)
     52     {
     53         int i=0;//代表是第几个汉字
     54         while(i<14&&s.find(arr[i])!=x)
     55             i++;
     56         if(i==14)     //出现错误,反馈error
     57         {
     58             cout<<"error"<<endl;
     59             break;
     60         }
     61         if(i>=10&&i<=12)
     62         {
     63             if(ss==0)sum+=has[i];
     64             ss*=has[i],sum+=ss,ss=0;
     65         }
     66         else if(i==13)
     67             sum+=ss,ss=0,sum*=has[13];
     68         else if(i>0)
     69             ss=has[i];
     70 
     71         for(int j=x; j<x+d[i]; j++) //走一步删一步
     72             s[j]='*';
     73         x+=d[i];
     74         // printf("***i=%d x=%d ss=%d sum=%d
    ",i,x,ss,sum);
     75     }
     76     return sum+ss;
     77 }
     78 double get_op(char sn[])
     79 {
     80     string s(sn);
     81     int x,len=s.length();
     82     double op=0.0;
     83     while(x=s.find("qi"),x>=0&&x<len)  //替换qi 和 qian
     84     {
     85         if(x+2<=len-1&&s[x+2]!='a')
     86             s[x]='Q';
     87         else if(x+2>=len)
     88             s[x]='Q';
     89         else
     90             s[x+1]='I';
     91     }
     92     while(x=s.find("ba"),x>=0&&x<len)  //替换Ba 和 bAi
     93     {
     94         if(x+2<=len-1&&s[x+2]!='i')
     95             s[x]='B';
     96         else if(x+2>=len)
     97             s[x]='B';
     98         else
     99             s[x+1]='A';
    100     }
    101     int sum=0,ss=0;
    102     x=s.find("zhe");  //删掉末尾的 zhe
    103     if(x>=0&&x<len)
    104         s.erase(x,4);
    105     len=s.length();
    106     x=0;
    107     int cnt=0;
    108     while(x<len)
    109     {
    110         int i=0;//代表是第几个个汉字
    111         while(i<14&&s.find(arr[i])!=x)
    112             i++;
    113         if(i==14)
    114         {
    115             cout<<"error"<<endl;
    116             break;
    117         }
    118         op=op*10.0+has[i];
    119         cnt++;
    120         for(int j=x; j<x+d[i]; j++) //走一步删一步
    121             s[j]='*';
    122         x+=d[i];
    123         //   printf("***i=%d x=%d op=%lf 
    ",i,x,op);
    124     }
    125     while(cnt--)
    126         op=op*0.1;
    127     return op;
    128 }
    129 int main()
    130 {
    131     char s1[100],s2[100],s3[100];
    132     while(scanf("%s%s%s",s1,s2,s3)!=EOF)
    133     {
    134         if(strcmp(s1,"yuanjia")==0)   //给的是原价和折扣op
    135         {
    136             double cost,discost,op;  //原价为cost,折扣后的价为discost!
    137             cost=solve(s2)*1.0;
    138             op=get_op(s3);//printf("op*****%.6lf
    ",op);
    139 
    140             discost=cost*op;
    141             printf("%.2lf %.2lf
    ",cost,discost);
    142         }
    143         else   //给的是折扣价和 折扣op
    144         {
    145             double cost,discost,op;
    146             discost=solve(s2);
    147             op=get_op(s3);//printf("op*****%.6lf
    ",op);
    148             cost=discost/op;
    149             printf("%.2lf %.2lf
    ",cost,discost);
    150         }
    151         //  printf("****%.4lf
    ",1.11/10.00);
    152     }
    153 
    154     return 0;
    155 }
    View Code(可以模仿着写写,花一天时间搞定也是值得的!)
  • 相关阅读:
    持续集成(CI)-概念
    python 多个路由参数传递
    python %s 占位符用法
    本地电脑密钥登陆服务器
    nginx 安装及反向代理、负载均衡、静态文件指向、结合uwsgi上线项目、处理跨域问题
    docker 进入容器
    将python文件变成一个shell脚本可执行文件
    python中quote函数是什么意思,怎么用?
    CentOS 使用 runserver 启动服务器后,常驻后台运行
    Open Set Domain Adaptation by Backpropagation(OSBP)论文数字数据集复现
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/9364495.html
Copyright © 2020-2023  润新知