沿时间轴枚举,发现关键时间点在于新题目被锁定的前一时间,那是新的题目还没有被锁定并且距离旧的题目已经被锁定的最晚时间,对这些时间点进行操作

 #define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int flag,s;
};
node c[];
bool cmp(node x,node y){
if(x.s!=y.s)
return x.s<y.s;
return x.flag<y.flag;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int m;
cin>>m;
while(m--){
int n,t,a,b;
cin>>n>>t>>a>>b;
int suma=,sumb=;
for(int i=;i<=n;++i){
cin>>c[i].flag;
if(c[i].flag)
++sumb;
}
suma=n-sumb;
for(int i=;i<=n;++i)
cin>>c[i].s;
sort(c+,c++n,cmp);
int now=;
int tempa=,tempb=;
int ans=;
for(int i=;i<=n;++i){//枚举当前时间c[i].s-1,即为当前题目被锁定的时间以前
//当前时间及以前被锁定的题目都要完成,当前时间只完成前i-1道已锁定的题目以及空余时间可以做的题目
int numa=min(suma-tempa,(c[i].s--now)/a);//如果完成锁定题目以外还有空余时间,计算得到空余时间可以解决的最大简单题数量
int numb=min(sumb-tempb,(c[i].s--now-numa*a)/b);//如果解决完简单题还有空余时间,计算得到空余时间可以解决的最大复杂题数量
if(numa<)
numa=;
if(numb<)
numb=;
if(now<=c[i].s-)//now表示完成已经锁定的题目(前i-1道)需要的时间,如果当前时间可以完成这些已经锁定的题目,答案才会更新
ans=max(ans,numa+numb+i-);
if(c[i].flag){
now+=b;
++tempb;//已锁定的复杂题
}
else{
now+=a;
++tempa;//已锁定的简单题
}
if(now>t)//完成锁定的题目需要的时间超出上限,那么就做不了更多的题目了,break
break;
if(i==n)//如果全部题目都已经锁定并且完成时间不超出上限
ans=n;
}
cout<<ans<<"\n";
}
return ;
}

Codeforces Round #610 (Div. 2)C(贪心,思维)的更多相关文章

  1. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  2. Codeforces Round #547 (Div. 3) F 贪心 + 离散化

    https://codeforces.com/contest/1141/problem/F2 题意 一个大小为n的数组a[],问最多有多少个不相交的区间和相等 题解 离散化用值来做,贪心选择较前的区间 ...

  3. Codeforces Round #595 (Div. 3)D1D2 贪心 STL

    一道用STL的贪心,正好可以用来学习使用STL库 题目大意:给出n条可以内含,相交,分离的线段,如果重叠条数超过k次则为坏点,n,k<2e5 所以我们贪心的想我们从左往右遍历,如果重合部分条数超 ...

  4. Codeforces Round #554 (Div. 2) D 贪心 + 记忆化搜索

    https://codeforces.com/contest/1152/problem/D 题意 给你一个n代表合法括号序列的长度一半,一颗有所有合法括号序列构成的字典树上,选择最大的边集,边集的边没 ...

  5. Codeforces Round #610 (Div. 2) A-E简要题解

    contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...

  6. Codeforces Round #303 (Div. 2) D 贪心

    D. Queue time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  7. Codeforces Round #336 (Div. 2)【A.思维,暴力,B.字符串,暴搜,前缀和,C.暴力,D,区间dp,E,字符串,数学】

    A. Saitama Destroys Hotel time limit per test:1 second memory limit per test:256 megabytes input:sta ...

  8. Codeforces Round #545 (Div. 2) D 贪心 + kmp

    https://codeforces.com/contest/1138/problem/D 题意 两个01串s和t,s中字符能相互交换,问最多能得到多少个(可交叉)的t 题解 即将s中的01塞进t中, ...

  9. Codeforces Round #547 (Div. 3) G 贪心

    https://codeforces.com/contest/1141/problem/G 题意 在一棵有n个点的树上给边染色,连在同一个点上的边颜色不能相同,除非舍弃掉这个点,问最少需要多少种颜色来 ...

随机推荐

  1. pandas 读取excel时,遇到数字变为科学计数法了, 怎么破?? 别慌 这样来处理

    # 指定字段以string 方式读取 df = pd.read_excel("./test.xlsx", converters={"id": str})

  2. [USACO10MAR] 伟大的奶牛聚集 - 树形dp

    每个点有重数,求到所有点距离最小的点 就是魔改的重心了 #include <bits/stdc++.h> using namespace std; #define int long lon ...

  3. Namespace declaration statement has to be the very first statement or after

    解决办法:将页面文件转为utp-8无dom格式就OK了.以notepad++为例:

  4. SSM+layui实现增删改查

    前端使用layui框架,后端使用Spring+SpringMVC+Mybatis的集合框架,数据库使用MySQL,完成对一张用户表的增删改查操作. 前后端分离开发,即前端的HTML页面通过ajax技术 ...

  5. 随机数模块random_python

    一.随机数模块random 1.常用的几个方法: import randomprint(random.random()) #(0,1)之间的随机数字,如0.6772275352932792print( ...

  6. 题解【洛谷P1725】琪露诺

    题面 典型的单调队列优化\(\text{DP}\)题. 不难想到设\(dp_i\)表示以\(i\)结尾能得到的最大冰冻指数. 这样设的转移方程也很简单:\(dp_i=\max\left\{ dp_j+ ...

  7. 为mongoDB加用户权限管理

    MongoDB常用命令 > show dbs                  #显示数据库列表 > show collections        #显示当前数据库中的集合(类似关系数据 ...

  8. centos7使用jenkins启动找不到模块

    问题: 在jenkins上启动pycharm项目报:ModuleNotFoundError: No module named 'wanwenyc' 其中‘wanwenyc’为pycharm工程项目路径 ...

  9. 一则关于控制文件全部丢失后如何重新编目RMAN元数据的简单实验

    主题:一则简单的RMAN元数据编目实验,来自于博客园AskScuti. 场景:RMAN备份完整情况下,未使用Catalog目录库.删除了所有的控制文件,在手工重建后,导致记录在控制文件中的RMAN备份 ...

  10. 【玩转SpringBoot】SpringBoot应用的启动过程一览表

    SpringBoot应用的启动方式很简单,就一行代码,如下图01: 其实这行代码背后主要执行两个方法,一个是构造方法,一个是run方法. 构造方法主要内容就是收集一些数据,和确认一些信息.如下图02: ...