ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C 六学家的困惑 【YY】 (2019年华南理工大学程序设计竞赛(春季赛))

2019-04-15 19:43:34  阅读:332  来源: 互联网

标签:小六 cout tp else YY 管子 2019 str 华南理工大学


冲鸭,去刷题:https://ac.nowcoder.com/acm/contest/625/C

小六喜欢两全其美的事情,今天就正好有一个这样的机会。

小六面前有两根管子,管子里面放满了数字为1到9的小球。每次取球时,小六会先选择一根管子,再从这根管子的某一侧(左侧或右侧)取出一个球。在满足取球规则的情况下,他可以任意顺序取出所有小球。假如小六依次取出的球的编号为a1,a2,⋯,ana1,a2,⋯,an,则他最后就得到了一个形如¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯a1a2⋯ana1a2⋯an¯样的十进制数。

小六希望他的取球顺序所组成的数是最大的,你可以帮一下他吗?

输入描述:

第一行输入数据组数。T (T≤14)T (T≤14)

接下来T行,每行输入两串只含1∼91∼9的数字,表示两根管子里的小球的数字。每根管子内至少含1个小球,且数量不超过40个。

输出描述:

对每一组数据,输出一行Case #x: A,其中x是数据组数编号(从1开始),A是小六能组成的最大的数。
示例1

输入

复制
2
123456 123456
9876346789 9854894589

输出

复制
Case #1: 665544332211
Case #2: 99998888776655498443

 

解题思路:

一:直接暴力模拟,每次取值都要同时从四个端点枚举(直到能判断那个端点最优),取最优端点的值最优。

二:其实上面的模拟过程抽象一下不就是把两个字符串取反后获得四个字符串,然后取字典序最大的那个吗......

 

AC code:

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 #define LL long long
 4 #define inc(i, j, k) for(int i = j; i <= k; i++)
 5 #define rep(i, j, k) for(int i = j; i < k; i++)
 6 #define mem(i, j) memset(i, j, sizeof(i))
 7 #define gcd(i, j) __gcd(i, j)
 8 using namespace std;
 9 const int MAXN = 2e5+10;
10 
11 string str, tp, a, b;
12 string ans, res;
13 
14 int main()
15 {
16     int T_case;
17     scanf("%d", &T_case);
18     inc(k, 1, T_case){
19         res = "";
20         cin >> str >> tp;
21         int L = 0, R = str.size()-1, l = 0, r = tp.size()-1;
22         while(L <= R || l <= r){
23             ans = "";
24             a = str;
25             b = tp;
26             reverse(a.begin(), a.end());
27             reverse(b.begin(), b.end());
28 
29 //            cout << L << " " << R << " " <<str << endl;
30 //            cout << l << " " << r << " " << tp << endl;
31 //            cout << "res: " << res << endl << endl;
32 
33             ans = max(ans, max(max(str, a), max(tp, b)));
34            // cout << ans << endl;
35             if(ans == str){
36                 res+=str[L++];
37 //                cout << "1: " << L-1 << " " << res << endl;
38                 if(L > R) str = "";
39                 else str = str.substr(L, (R-L+1));
40             }
41             else if(ans == tp){
42                 res+=tp[l++];
43 //                cout << "2: " << l-1 << " " << res << endl;
44                 if(l > r) tp = "";
45                 else tp = tp.substr(l, (r-l+1));
46             }
47             else if(ans == a){
48                 res+=str[R--];
49 //                cout << "3: " << R+1 << " " << res << endl;
50                 if(L > R) str = "";
51                 else str = str.substr(L, (R-L+1));
52             }
53             else if(ans == b)
54             {
55                 res+=tp[r--];
56 //                cout << "4: " << r+1 << " " << res << endl;
57                 if(l > r) tp = "";
58                 else tp = tp.substr(l, (r-l+1));
59             }
60             L = 0;R = str.size()-1;l = 0; r = tp.size()-1;
61         }
62         cout << "Case #" << k << ": " << res << endl;
63     }
64     return 0;
65 }
View Code

 

标签:小六,cout,tp,else,YY,管子,2019,str,华南理工大学
来源: https://www.cnblogs.com/ymzjj/p/10712554.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有