随笔 - 104  文章 - 0  评论 - 0  阅读 - 23855

牛客小白月赛100 ACM中的CM题

 示例1

3
1 1 2

输出

1
2
说明
瞬移到1处排 [1, 1]的2个雷
瞬移到2处排 [2, 2]的1个雷
 
示例2
4
1 2 4 5

输出

1
3

 

首先尝试了暴力解法,结果当然超时了。

复制代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 bool graph[200005];
 4 int n;
 5 int position = 0;
 6 int result = 10000;
 7 void travel(int index,int m,int count){
 8     if (position < index){
 9         result = min(count, result);
10         return;
11     }
12     int i;
13     for (i = index; i <= position; ++i){
14         if (graph[i]){
15             break;
16         }
17     }
18     if(m + 1 <= position - i)
19         travel(i, m + 1, count + 1);
20     travel(i + m, m, count + 1);
21 }
22 int main(){
23     cin>>n;
24     int temp;
25     memset(graph,false,sizeof(graph));
26     for (int i = 0; i < n; ++i){
27         cin>>temp;
28         graph[temp] = true;
29         position = max(position, temp);
30     }
31     
32     travel(1, 1, 0);
33     cout<<result<<endl;
34 }
复制代码

然后试了dp,还是没通过,看了唯一的题解,也没看懂是不是贪心。‘

其思路是取 0<=m<=n,枚举后输出最小花费。即固定m,然后看需要几跳可以遍历数轴。应该勉强算贪心策略吧....

复制代码
#include<bits/stdc++.h>
using namespace std;
bool graph[200005];
int n;
int position = 0;
int result = INT32_MAX;
int travel(int index, int m, int count){
    if (position < index){
        return count;
    }
    int i;
    for (i = index; i <= position; ++i){
        if (graph[i]){
            break;
        }
    }
    return travel(i + m + 1, m, count + 1);
}
int main(){
    cin>>n;
    int temp;
    memset(graph, false, sizeof(graph));
    for (int i = 0; i < n; ++i){
        cin>>temp;
        graph[temp] = true;
        position = max(position, temp);
    }
    for (int i = 0; i <= n ; ++i){
        result = min(result,travel(1, i, i));
    }

    cout<<result<<endl;
}
复制代码

 

posted on   Coder何  阅读(72)  评论(0编辑  收藏  举报
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示