牛客小白月赛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; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步