2 条题解
-
0
这一题看上去显然是贪心,我们设两个指针,a 表示头指针,也就是队列首端, b 表示为指针,也就是队列末端。
下面是最好容易想到的策略:
当 s[ a ]>s[ b ] ,我们肯定是会选 s[ b ] ,随之 b−− 。
当 s[ a ]<s[ b ] ,我们肯定是会选 s[ a ] ,随之 a++ 。
但是,通过样例我们发现,会出现 s[ a ]==s[ b ] 情况,这种情况该怎么处理呢?
其实也很简单,我们找距离 s[ a ] 和 s[ b ] 最近的且不等于 s[ a或b ] 的字符,再比较它们大小即可。
/* 这一题看上去显然是贪心,我们设两个指针,a 表示头指针,也就是队列首端, b 表示为指针,也就是队列末端。 下面是最好容易想到的策略: 当 s[ a ]>s[ b ] ,我们肯定是会选 s[ b ] ,随之 b−− 。 当 s[ a ]<s[ b ] ,我们肯定是会选 s[ a ] ,随之 a++ 。 但是,通过样例我们发现,会出现 s[ a ]==s[ b ] 情况,这种情况该怎么处理呢? 其实也很简单,我们找距离 s[ a ] 和 s[ b ] 最近的且不等于 s[ a或b ] 的字符,再比较它们大小即可。 */ #include <bits/stdc++.h> using namespace std; char s[3010]; int main () { int n;cin>>n; for (int i=1;i<=n;i++)cin>>s[i]; int a=1,b=n; for (int i=1;i<=n;i++) { if (s[ a ]==s[ b ]) { int p=a,q=b; while (s[p]==s[q]) p++,q--;//策略3。 if (s[p]<=s[q]) printf ("%c",s[ a]),a++;//这里又可以想到上面最简单的两种策略。 else printf ("%c",s[ b ]),b--; } else { if (s[ a ] >s[ b ]) printf ("%c",s[ b ]),b--;//策略1。 else printf ("%c",s[ a ]),a++;//策略2。 } if(i%80==0) puts("");//每80个字符就换行。 } return 0; } -
0
/* 这一题看上去显然是贪心,我们设两个指针,a 表示头指针,也就是队列首端, b 表示为指针,也就是队列末端。 下面是最好容易想到的策略: 当 s[ a ]>s[ b ] ,我们肯定是会选 s[ b ] ,随之 b−− 。 当 s[ a ]<s[ b ] ,我们肯定是会选 s[ a ] ,随之 a++ 。 但是,通过样例我们发现,会出现 s[ a ]==s[ b ] 情况,这种情况该怎么处理呢? 其实也很简单,我们找距离 s[ a ] 和 s[ b ] 最近的且不等于 s[ a或b ] 的字符,再比较它们大小即可。 */ #include <bits/stdc++.h> using namespace std; char s[3010]; int main () { int n;cin>>n; for (int i=1;i<=n;i++)cin>>s[i]; int a=1,b=n; for (int i=1;i<=n;i++) { if (s[ a ]==s[ b ]) { int p=a,q=b; while (s[p]==s[q]) p++,q--;//策略3。 if (s[p]<=s[q]) printf ("%c",s[ a]),a++;//这里又可以想到上面最简单的两种策略。 else printf ("%c",s[ b ]),b--; } else { if (s[ a ] >s[ b ]) printf ("%c",s[ b ]),b--;//策略1。 else printf ("%c",s[ a ]),a++;//策略2。 } if(i%80==0) puts("");//每80个字符就换行。 } return 0; }
- 1
信息
- ID
- 1504
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 99
- 已通过
- 40
- 上传者