首页 > 其他 > 详细

Educational Codeforces Round 76 (Rated for Div. 2) D题

时间:2019-11-14 14:21:01      阅读:96      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 题意:

给你n个关卡,每个关卡有一个怪物,怪物的攻击力为a【i】,你有n个英雄,每个英雄有一个攻击力,和疲劳值,只要英雄的攻击力比怪物的高就算打过了,同时疲劳减一,一天只能出战一个英雄,一个英雄可以打好几关(只要在疲劳范围内),打不过的话英雄就结束今天的挑战,转到第二天。问最少需要出战多少英雄才能通过所有关卡。

思路:先用一个数组。跑出相同忍耐值时,攻击力越大。然后·跑出这个数组的后缀pre数组,pre数组的含义是:忍耐值一定,攻击力最大。然后通过O(n)的复杂度跑·怪物的数组。当怪物的a【i】值大于pre数组在上一天的攻击力时,进入下一天。【变相的二分】【题目比较难叙述QAQ】

代码:

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4  
 5 #define int long long
 6 const int N=22e4;int n;
 7 int arr[N];
 8 int pre[N];
 9 int str[N];
10 int slove(){
11     int ans=1;//总天数 
12     int last_time=-1;
13     int maxn=0;
14     for(int i=0;i<n;i++){
15         maxn=max(maxn,arr[i]);
16         if(pre[i-last_time]<maxn){
17             last_time=i-1;
18             ans++;
19             maxn=arr[i];
20         }
21         if(pre[1]<arr[i]){
22             return -1;
23         }
24     }
25     return ans;
26 }
27 signed  main(){
28     ios::sync_with_stdio(0);
29     int _;
30     cin>>_;
31     while(_--){
32         cin>>n;
33         int maxn1=0,maxn2=0;
34         for(int i=0;i<=n+10;i++)    
35             arr[i]=0,str[i]=0,pre[i]=0;
36         for(int i=0;i<n;i++){
37             cin>>arr[i];
38             maxn1=max(maxn1,arr[i]);
39         }
40         int m;
41         cin>>m;
42         for(int i=0;i<m;i++){
43             int x,y;
44             cin>>x>>y;
45             maxn2=max(maxn2,x);
46             pre[y]=max(pre[y],x);//相同忍耐值时,攻击力越大 
47         }
48         if(maxn1>maxn2){
49             cout<<"-1"<<\n;
50             continue;
51         }
52         for(int i=n-1;i>0;i--){
53             pre[i]=max(pre[i+1],pre[i]);// 
54         }
55         cout<<slove()<<\n;
56     }
57     return 0;
58 }

 

Educational Codeforces Round 76 (Rated for Div. 2) D题

原文:https://www.cnblogs.com/pengge666/p/11856316.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!