夯实基础——P3742 umi的函数
题目链接:https://www.luogu.org/problem/P3742
P3742 umi的函数
题目背景
umi 找到了一个神秘的函数 f。
题目描述
这个函数接受两个字符串 s1,s2。这些字符串只能由小写字母组成,并且具有相同的长度。这个函数的输出是另一个长度与 s1,s2 相同的字符串 g。g 的第 i 个字符等于 s1 的第i 个字符和 s2 的第 i 个字符的最小值,简单来说,g[i]=min(s1[i],s2[i])。
例如:f("ab","ba")= "aa", f("nzwzl","zizez")="niwel".
她现在有两个相同长度的只有小写字母的字符串 x,y。找出任何一个满足 f(x,z)=y 的
字符串 z。如果找不到这样的字符串的话,请输出-1。
输入格式
第一行给出以下两个字符串的长度 n。
第二行给出一个字符串 x。
第三行给出一个字符串 y。
输出格式
第一行输出一个字符串,代表你找到的符合条件的字符串。找不到的话,请输出-1。
输入输出样例
2 ab aa
ba
5 nzwzl niwel
xiyez
2 ab ba
-1
说明/提示
对于 100%的数据,1<=n<=100。
这道题我竟然想歪了,原因就是没有仔细读题,注意“找出任何一个满足 f(x,z)=y 的字符串 z”中的“任何”!!!说明了此题有多个解!!!而答案只让输出其中的一个解,所以这道题的最佳做法就出来了
最佳做法:在读入的时候判断一下是否合法,如果不合法,就输出-1,否则就直接输出字符串y
上代码:
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 string a,b; 7 8 int n; 9 10 int main() 11 { 12 cin>>n>>a>>b; 13 int len=a.size(); 14 for(int i=0;i<len;i++) 15 if(a[i]<b[i]) { cout<<-1<<endl; return 0; } 16 cout<<b<<endl; 17 return 0; 18 }
最佳做法说完了,然后再谈谈我我自己的想法。
首先是判断输入是否合法,然后对于最终得到的字符串y和原先的字符串x进行一位一位的求解。我们首先知道字符串y中的字符肯定要比字符串x中的字符小,所以我们对字符串y中的字符+5(不要问我5是怎么得来的,我也不知道。原来尝试的是6,但发现wa了9个点,得了64分),这时我们会发现新得到的字符C可能比字符串x中的字符大,即min(x , z) != y。所以接下来就要将字符C不断的减少1,直到min(x , z) == y。
上代码:
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 int a[10010],b[10100],aim[10100],n;//a是字符串x,b是字符串y,aim是字符串z 7 8 int main() 9 { 10 cin>>n; 11 for(int i=1;i<=n;i++) 12 { 13 char c; cin>>c; 14 a[i]=c-'a'; 15 } 16 for(int i=1;i<=n;i++) 17 { 18 char c; cin>>c; 19 aim[i]=c-'a'; 20 if(aim[i]>a[i]) 21 { 22 cout<<-1<<endl; 23 return 0; 24 } 25 } 26 for(int i=1;i<=n;i++) 27 { 28 b[i]=aim[i]+5; 29 while(min(b[i],a[i])!=aim[i]) b[i]--; 30 } 31 for(int i=1;i<=n;i++) 32 cout<<char(b[i]+'a'); 33 return 0; 34 }
夯实基础,认真做好每一道题!!!
2019-08-07
本文版权归作者和博客园共有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。