main
黄海 1 year ago
parent 486530f7c7
commit 9b18e1c531

@ -1,30 +1,65 @@
#include <bits/stdc++.h>
using namespace std;
int res; // 一共处理几次
// 是不是全是字符零
bool isAllZero(string s) {
for (int i = 0; i < s.size(); i++)
if (s[i] != '0') return false;
return true;
}
/*
5
12321
*/
int cnt = 1;
// 结构体
struct Node {
int c;
int count;
int st, ed;
bool const operator<(const &Node t) {
if (count != t.count) return count > t.count;
if (st < t.st && ed > t.ed) return false;
return true;
}
};
// 递归写法
void dfs(string s) {
int p;
for (p = s.size() - 1; p >= 1; p--)
if (s[0] != s[p]) break;
int p1[10], p2[10];
string t;
for (int i = 1; i <= p; i++) t += s[i];
if (t.size()) cnt++, dfs(t);
}
vector<Node> a;
int main() {
int n;
string s;
int n; // n个长度的字符串
string s; // 字符串
cin >> n >> s;
dfs(s);
cout << cnt << endl;
// 多次循环,判断是不是已经全是'0'的字符串,如果不是,则继续处理
while (!isAllZero(s)) {
// 记录有多少个非0数字都是多少个
memset(b, 0, sizeof b);
memset(p1, -1, sizeof p1);
memset(p2, -1, sizeof p2);
for (int i = 0; i < s.size(); i++) {
if (s[i] != '0') {
b[s[i] - '0']++;
if (p1[s[i] - '0'] == -1)
p1[s[i] - '0'] = i; // 记录起点
else
p2[s[i] - '0'] = i; // 记录终点
}
}
// 整理一下
vector<Node> q;
for (int i = 1; i <= 9; i++)
if (b[i]) q.push_back({i, b[i], p1[i], p2[i] == -1 ? p1[i] : p2[i]}); // 几个在前,是啥数字在后
sort(q.begin(), q.end());
// 最多的数字是num,个数=count,这个是最牛X的
int num = q[0].second;
// 找出这个数字的起止位置
for (int i = 0; i < q.size(); i++)
if ((int)s[i] == num) s[i] = '0';
}
// 输出一共处理了几次
cout << res << endl;
return 0;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

@ -1,58 +0,0 @@
#include <bits/stdc++.h>
using namespace std;
bool isAllZero(string s) {
for (int i = 0; i < s.size(); i++)
if (s[i] != '0')
return false;
return true;
}
struct Node {
char c; //字符
int count;//个数
int st, ed;//开始位置,停止位置
bool const operator<(const &Node t) {
// 如果数量不相等,那么数量多的在前
if (count != t.count)
return count > t.count;
// 如果数量相等,是不是存在区间包含
if (st < t.st && ed > t.ed)//两个结构体对比,如果第一个包含第二个,那么第一个在前,否则第二个在前
return false;
//默认值是第二个在前
return true;
}
};
int b[10];
void tj() {
memset(b, 0, sizeof b);
vector<pair<int, int>> q;
for (int i = 0; i < s.size(); i++) {
if (s[i] != '0')
b[s[i] - '0']++;
}
for (int i = 1; i <= 9; i++)
if (b[i])
q.push_back({ b[i], i});
sort(q.begin(), q.end());
for (int i = 0; i < q.size(); i++)
//TODO 最多的数量还没有记录起止位置需要继续实现
}
vector<Node> a;
int main() {
int n;
string s;
cin >> n >> s;
while (!isAllZero(s)) {
}
return 0;
}
Loading…
Cancel
Save