*/-->
pre.src {background-color: Black; color: White;}
pre.src {background-color: Black; color: White;}
贪心:字典序最小问题
给定长度为 n 的字符串 s,要构造一个长度为 n 的字符串 t。起初,t 是一个空串,随后反复进行下列操作 1. 从 s 的头部删除一个字符,加到 t 的尾部 2. 从 s 的尾部删除一个字符,加到 t 的尾部 求 t 是字典序尽可能小的字符串 示例: n = 6 s = "ACDBCB" 构造 t t: a s: cdbcb t: ab s: cdbc t: abc s: cdb # 注意这里选择的 c 的方向,选错了就不是最小 t: abcb s: cd t: accbc s: d t: abcbcd s:
看算法实现吧,很容易明白的,反正我是看明白了
// CreateTime: 2015-04-07 21:55:59 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <cmath> #include <algorithm> #include <queue> using namespace std; string s; string t; void solve() { cin >> s; int len = s.length(); int l = 0; int r = len-1; int sub = 0; while (l <= r) { bool left = 0; for (int i = 0; l+i <= r; i++) { if (s[l+i] < s[r-i]) { left = 1; break; } else if (s[l+i] > s[r-i]) { left = 0; break; } } if (left) { t[sub++] = s[l++]; } else { t[sub++] = s[r--]; } } t[sub] = ‘\0‘; // cout << t << endl; // 不明白为什么不能输出 cout << t.c_str() << endl; } int main(void) { solve(); return 0; }
时间: 2024-10-12 03:53:24