题解 P1603 【斯诺登的密码】
Trinitrotoluene · · 题解
看到大佬们都在用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。