题解 P1603 【斯诺登的密码】

· · 题解

看到大佬们都在用map或优先队列,蒟蒻感到瑟瑟发抖。

但是,有没有人想到过用string?

string可是能够直接比较大小的!

举个栗子:string a=…, b=…; if(a>b)… ; if(a<b)… ; if(a==b)… ;

下面,借助代码来理解:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace sdt;
string a[]={"one","two","three","four","five","six","seven","eight","nine","eleven","twelve",
"thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","a","both","another",
"first","second","third"};//没有0、10、20
string s;
int b[]={1,4,9,16,25,36,49,64,81,21,44,69,96,25,56,89,24,61,1,4,1,1,4,9};
int k[6],p;
int main(){
    cin.sync_with_stdio(0);/cin的优化
    for(int i=0;i<6;i++){
        cin>>s;
        for(int j=0;j<24;j++)   if(s==a[j]) k[p++]=b[j];
        //确认读入的字符串是否为数字,以及为何数字
    }
    if(!p)  {putchar(48);return 0;}
    //Caution!如果没有这句话,那么当没有数字的时候,p=0,就会RE
    sort(k,k+p-1);
    printf("%d",k[0]);//输出首位,不加前导0
    for(int i=1;i<p;i++)    printf("%02d",k[i]);
    //当该数非首位且其小于10时,就要在其前面补充一个0
    return 1;

最后,再补充几点细节:

1、读入时句号前面有空格,因此不需要特殊处理。

2、当读入没有数字时,一定要特判!

3、当读入的数字个位数为0时,平方后%100后就会变为0,排序后就会排在第一位,作为前导0而被过滤掉。

4、string的读入必须用iostream,不能用cstdio。