|
|
|
@ -5,6 +5,20 @@ using namespace std;
|
|
|
|
|
2 3 4 5 2
|
|
|
|
|
答案:4
|
|
|
|
|
|
|
|
|
|
算法:
|
|
|
|
|
1、开a[N]数组,记录目标密码锁的密码,本例就是 a[]={ 2 , 3 , 4 , 5 , 2}
|
|
|
|
|
|
|
|
|
|
2、模拟我们从{0,0,0,0,0}出发,看看是不是到达了目标状态
|
|
|
|
|
|
|
|
|
|
3、如果还没有到达目标状态,我们来研究一下,怎么能尽快的向目标逼近
|
|
|
|
|
|
|
|
|
|
(1)出现次数最多的数字,起始,终止
|
|
|
|
|
(2)如果有个次数一样多的数字,那么起始终止范围大的在前
|
|
|
|
|
(3)如果不存在范围包含关系,那么号小的在前(其实是随意的)
|
|
|
|
|
本例 就是找到了2。标记 use[2]=1,表示2已处理 res++。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
3 2 4 2 5
|
|
|
|
|
答案:4
|
|
|
|
@ -76,11 +90,7 @@ int main() {
|
|
|
|
|
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';
|
|
|
|
|
for (int i = q[0].st; i <= q[0].ed; i++) s[i] = q[0].c;
|
|
|
|
|
}
|
|
|
|
|
// 输出一共处理了几次
|
|
|
|
|
cout << res << endl;
|
|
|
|
|