华师一附中OI组
标题: P1603 斯诺登的密码 [打印本页]
作者: 倚窗倾听风吹雨 时间: 2018-8-2 10:29
标题: P1603 斯诺登的密码
https://www.luogu.org/problemnew/show/P1603
题目背景
根据斯诺登事件出的一道水题
题目描述
题目描述
2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机。但是,这件事情太不周密了,因为FBI的间谍早已获悉他的具体位置——但这不是最重要的——最重要的是如果要去委内瑞拉,那么就要经过古巴,而经过古巴的路在美国的掌控之中。丧心病狂的奥巴马迫降斯诺登的飞机,搜查时却发现,斯诺登杳无踪迹。但是,在据说是斯诺登的座位上,发现了一张纸条。纸条由纯英文构成:Obama is a two five zero.(以"."结束输出,只有6个单词+一个句号,句子开头如没有大写亦为合法)这句话虽然有点无厘头,但是警官陈珺骛发现这是一条极其重要的线索。他在斯诺登截获的一台笔记本中找到了一个C++程序,输入这条句子后立马给出了相对应的密码。陈珺鹜高兴得晕了过去,身为警官的你把字条和程序带上了飞机,准备飞往曼哈顿国际机场,但是在飞机上检查的时候发现——程序被粉碎了!飞机抵达华盛顿只剩5分钟,你必须在这5分钟内编写(杜撰)一个程序,免受上司的10000000000%10大板。破译密码的步骤如下:
(1)找出句子中所有用英文表示的数字(≤20),列举在下:
正规:one two three four five six seven eight nine ten eleven twelvethirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty
非正规:a both another first second third
(2)将这些数字平方后%100,如00,05,11,19,86,99。
(3)把这些两位数按数位排成一行,组成一个新数,如果开头为0,就去0。
(4)找出所有排列方法中最小的一个数,即为密码。
// 数据已经修正 By absi2011 如果还有问题请联系我
输入输出格式
输入格式:
一个含有6个单词的句子。
输出格式:
一个整型变量(密码)。
输入输出样例
输入样例#1:复制
Black Obama is two five zero .
输出样例#1:复制
425
作者: 倚窗倾听风吹雨 时间: 2018-8-2 10:30
- #include<iostream>
- using namespace std;
- string s,s1[26]={" 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 "};
- int a[20],num[10];
- long long int ans=99999999999,t=0;
- bool visit[10];
- void dfs(int x,int y)
- {
- if(x>y)
- {
- ans=min(ans,t);
- return;
- }
- for(int i=0;i<=y;i++)
- {
- if(!visit[i])
- {
- visit[i]=1;
- t=t*100+num[i];
- dfs(x+1,y);
- t=(t-num[i])/100;
- visit[i]=0;
- }
- }
- }
- int main()
- {
- getline(cin,s);
- s[s.size()-1]=' ';
- s=" "+s;
- /// cout<<s<<endl;;
- for(int i=0;i<=25;i++)
- {
- /// cout<<s1[i];
- int j=0;
- j=s.find(s1[i],0);
- /// cout<<j<<" ";
- if(i<=19)a[i]++;
- if(i==20 || i==22 || i==23)a[0]++;
- if(i==21 || i==24)a[1]++;
- if(i==25)a[2]++;
- while(j!=-1)
- {
- j=s.find(s1[i],j+5);
- /// cout<<j<<" ";
- if(i<=19)a[i]++;
- if(i==20 || i==22 || i==23)a[0]++;
- if(i==21 || i==24)a[1]++;
- if(i==25)a[2]++;
- }
- /// cout<<endl;
- if(i<=19)a[i]--;
- if(i==20 || i==22 || i==23)a[0]--;
- if(i==21 || i==24)a[1]--;
- if(i==25)a[2]--;
- }
- /* for(int i=0;i<=19;i++)
- cout<<a[i]<<" ";
- cout<<endl;*/
- int n=0;
- for(int i=0;i<=19;i++)
- for(int j=1;j<=a[i];j++)
- num[n++]=((i+1)*(i+1))%100;
- n--;
- dfs(0,n);
- cout<<ans<<endl;
- return 0;
- }
复制代码
作者: admin 时间: 2018-8-2 16:47
可以不可以考虑使用map_?
作者: 黄煦喆 时间: 2018-8-25 16:56
- #include<iostream>
- #include<map>
- using namespace std;
- map<string,int>m;
- string s,ans[6];
- int l,t;
- int main()
- {
- m["one"]=1;m["two"]=2;m["three"]=3;m["four"]=4;m["five"]=5;
- m["six"]=6;m["seven"]=7;m["eight"]=8;m["nine"]=9;m["ten"]=10;
- m["eleven"]=11;m["twelve"]=12;m["thirteen"]=13;m["fourteen"]=14;m["fifteen"]=15;
- m["sixteen"]=16;m["seventeen"]=17;m["eighteen"]=18;m["nineteen"]=19;m["twenty"]=20;
- m["a"]=1;m["both"]=2;m["another"]=1;m["first"]=1;m["second"]=2;m["third"]=3;
- for(int i=0;i<6;i++)
- {
- cin>>s;
- l=s.size();
- for(int j=0;j<l;j++)if('A'<=s[j]&&s[j]<='Z')s[j]+='a'-'A';
- if(m[s])
- {
- int k=m[s]*m[s]%100;
- ans[t]+=k/10+'0';
- ans[t]+=k%10+'0';
- t++;
- }
- }
- if(t==0){cout<<'0'<<endl;return 0;}
- sort(ans,ans+t);
- if(ans[0][0]=='0')cout<<ans[0][1];
- else cout<<ans[0];
- for(int i=1;i<6;i++)cout<<ans[i];cout<<endl;
- return 0;
- }
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/) |
Powered by Discuz! X3.2 |