华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1280|回复: 3
打印 上一主题 下一主题

P1603 斯诺登的密码

[复制链接]

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
跳转到指定楼层
楼主
发表于 2018-8-2 10:29:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1603



题目背景
根据斯诺登事件出的一道水题
题目描述
题目描述
2013XX日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机。但是,这件事情太不周密了,因为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



回复

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
沙发
 楼主| 发表于 2018-8-2 10:30:15 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. string s,s1[26]={" one "," two "," three "," four "," five "," six "," seven "," eight "," nine "," ten "," eleven "," twelve "," thirteen ",
  4. " fourteen "," fifteen "," sixteen "," seventeen "," eighteen "," nineteen "," twenty "," a "," both "," another "," first "," second "," third "};
  5. int a[20],num[10];
  6. long long int ans=99999999999,t=0;
  7. bool visit[10];
  8. void dfs(int x,int y)
  9. {
  10.     if(x>y)
  11.     {
  12.         ans=min(ans,t);
  13.         return;
  14.     }
  15.     for(int i=0;i<=y;i++)
  16.     {
  17.         if(!visit[i])
  18.         {
  19.             visit[i]=1;
  20.             t=t*100+num[i];
  21.             dfs(x+1,y);
  22.             t=(t-num[i])/100;
  23.             visit[i]=0;
  24.         }
  25.     }
  26. }
  27. int main()
  28. {
  29.     getline(cin,s);
  30.     s[s.size()-1]=' ';
  31.     s=" "+s;
  32. ///        cout<<s<<endl;;
  33.     for(int i=0;i<=25;i++)
  34.     {
  35. ///                cout<<s1[i];
  36.         int j=0;
  37.         j=s.find(s1[i],0);
  38. ///                cout<<j<<" ";
  39.         if(i<=19)a[i]++;
  40.         if(i==20 || i==22 || i==23)a[0]++;
  41.         if(i==21 || i==24)a[1]++;
  42.         if(i==25)a[2]++;
  43.         while(j!=-1)
  44.         {
  45.             j=s.find(s1[i],j+5);
  46. ///                        cout<<j<<" ";
  47.             if(i<=19)a[i]++;
  48.             if(i==20 || i==22 || i==23)a[0]++;
  49.             if(i==21 || i==24)a[1]++;
  50.             if(i==25)a[2]++;
  51.         }
  52. ///                cout<<endl;
  53.         if(i<=19)a[i]--;
  54.         if(i==20 || i==22 || i==23)a[0]--;
  55.         if(i==21 || i==24)a[1]--;
  56.         if(i==25)a[2]--;
  57.     }
  58. /*        for(int i=0;i<=19;i++)
  59.     cout<<a[i]<<" ";
  60.     cout<<endl;*/
  61.     int n=0;
  62.     for(int i=0;i<=19;i++)
  63.         for(int j=1;j<=a[i];j++)
  64.             num[n++]=((i+1)*(i+1))%100;
  65.     n--;
  66.     dfs(0,n);
  67.     cout<<ans<<endl;
  68.     return 0;
  69. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
板凳
发表于 2018-8-2 16:47:23 来自手机 | 只看该作者
可以不可以考虑使用map_?
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
地板
发表于 2018-8-25 16:56:41 | 只看该作者
  1. #include<iostream>
  2. #include<map>
  3. using namespace std;
  4. map<string,int>m;
  5. string s,ans[6];
  6. int l,t;
  7. int main()
  8. {
  9.     m["one"]=1;m["two"]=2;m["three"]=3;m["four"]=4;m["five"]=5;
  10.     m["six"]=6;m["seven"]=7;m["eight"]=8;m["nine"]=9;m["ten"]=10;
  11.     m["eleven"]=11;m["twelve"]=12;m["thirteen"]=13;m["fourteen"]=14;m["fifteen"]=15;
  12.     m["sixteen"]=16;m["seventeen"]=17;m["eighteen"]=18;m["nineteen"]=19;m["twenty"]=20;
  13.     m["a"]=1;m["both"]=2;m["another"]=1;m["first"]=1;m["second"]=2;m["third"]=3;
  14.     for(int i=0;i<6;i++)
  15.     {
  16.         cin>>s;
  17.         l=s.size();
  18.         for(int j=0;j<l;j++)if('A'<=s[j]&&s[j]<='Z')s[j]+='a'-'A';
  19.         if(m[s])
  20.         {
  21.             int k=m[s]*m[s]%100;
  22.             ans[t]+=k/10+'0';
  23.             ans[t]+=k%10+'0';
  24.             t++;
  25.         }
  26.     }
  27.     if(t==0){cout<<'0'<<endl;return 0;}
  28.     sort(ans,ans+t);
  29.     if(ans[0][0]=='0')cout<<ans[0][1];
  30.     else cout<<ans[0];
  31.     for(int i=1;i<6;i++)cout<<ans[i];cout<<endl;
  32.     return 0;
  33. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-27 03:49 , Processed in 0.107221 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表