P1603 斯诺登的密码
1.题目介绍
斯诺登的密码
题目背景
根据斯诺登事件出的一道水题
题目描述
(1)找出句子中所有用英文表示的数字
正规:one two three four five six seven eight nine ten eleven twelve
thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty
非正规:a both another first second third
。为避免造成歧义,another
算作
(2)将这些数字平方后对
(3)把这些两位数按数位排成一行,组成一个新数,如果开头为
(4)找出所有排列方法中最小的一个数,即为密码。
// 数据已经修正 By absi2011 如果还有问题请联系我
输入格式
一个含有
输出格式
一个整型变量(密码)。如果没有符合要求的数字出现,则输出
样例 #1
样例输入 #1
Black Obama is two five zero .
样例输出 #1
425
2.题解
2.1 字符串函数(打表)
思路
主要思路还是打表,然后将所有有效数据存储到一个vector中并排序,越小的数排在前面,最终组成的数也是最小的
为何呢?首先讨论一下个位数和十位数的情况:
1.放在首位,个位数其实组成是0x,放在首位直接整个组成数位数小一个,肯定小
2.放在中间,由于组成是0x,实际上跟十位数是一样的,但是0肯定小于其他数,所以还是小
如果是首个数字的话,0可以省略,其他情况0不可以省略
然后一定要记住如果一个数字都没有的话,要输出0!!!
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> arr;
unordered_map<string, int> word = {
{"zero", 0},
{"a", 1},
{"another", 1},
{"both", 2},
{"first", 1},
{"second", 2},
{"third", 3},
{"one", 1},
{"two", 2},
{"three", 3},
{"four", 4},
{"five", 5},
{"six", 6},
{"seven", 7},
{"eight", 8},
{"nine", 9},
{"ten", 10},
{"eleven", 11},
{"twelve", 12},
{"thirteen", 13},
{"fourteen", 14},
{"fifteen", 15},
{"sixteen", 16},
{"seventeen", 17},
{"eighteen", 18},
{"nineteen", 19},
{"twenty", 20}
};
string str;
for(int i = 0; i < 6; i++){
cin >> str;
if(word.count(str)){
int temp = word[str] * word[str] % 100;
if (temp != 0) arr.push_back(temp);
}
}
// 写到这的时候刚好测试数据次数没了,不知道为啥第三个数据一直过不去,结果应该是
if(arr.empty()){
cout << "0";
return 0;
}
sort(arr.begin(), arr.end());
for(auto it = arr.begin(); it != arr.end(); it++){
if(it != arr.begin() && *it < 10) cout << 0;
cout << *it;
}
}
分类:
洛谷
, 数据结构与算法 / 字符串
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了