• 1759E(方案枚举)


    题目链接

    题目大意:

    给你n个数(n个宇航员对应的能量值) 一个h ,h表示机器人当前的能量值。机器人拥有2中绿色的药剂,一瓶蓝色的药剂。其中绿色的药剂可以使机器人的能量值变为现在的2倍(2->2 * 2 = 4),蓝色的药剂可以使机器人的能量值变为现在的3倍(2 -> 2 * 3 = 6)。机器人每秒可以进行下列中的任意一个操作:

    1. 吸收一个拥有更少人类力量的宇航员(即:a[i] < h ),此时h = h + (a[i] / 2), "/"表示整数运算,向下取整。
    2. 使用绿色药剂(确保他有)
    3. 使用蓝色药剂(确保他有)

    问该机器人最多可以吸收几个宇航员的能量值?

    解题思路:

    机器人要想吸收更多的人,那么他一定会先吸收,直到不能吸收为止,然后使用药剂。但是药剂有3瓶2种,我们该如何去进行选择呢?(哈哈)仔细想想他不就三瓶吗?我直接枚举不就好了,也不过3种可能,最后求最大值就好了。根据贪心原则,他想要吸收更多人的能量,他就要先吸收能量最小的人。这样也可以用一个优先队列维护,当然排序也是可以的。注意:要使用long long,不然会爆int的。

    AC代码:

    cpp
    #include#define int long long#define sz(a) ((int) (a).size())#define vi vector< int >#define me(a, x) memset(a, x, sizeof(a))#define ull unsigned long long#define PII pairusing namespace std; const int N = 2e5 + 10;int n, h;int f[3][3] = {{2, 2, 3}, {2, 3, 2}, {3, 2, 2}}; //枚举方案 int a[N];void solved(){	cin >> n >> h;		for (int i = 1; i <= n; i ++ )	{		cin >> a[i];	}		int cnt, mx = 0, res;		for (int u = 0; u < 3; u ++ )	{		int hh = h;		cnt = 0;		res = 0;		priority_queue, greater > q;		for (int i = 1; i <= n; i ++ ) q.push(a[i]); 		while (q.size())		{			int hhh = q.top();			q.pop();			if (hhh < hh) //如果可以吸收直接吸收就好了 			{				hh += (hhh / 2);				res ++;				continue ;			}						while (hhh >= hh && cnt < 3) //不能直接吸收,那就用药剂增强自己 			{				hh *= f[u][cnt++];			}			if (hhh >= hh) break; //增强后也不可以,那就不能吸收了呗 			hh += (hhh / 2);			res ++;		}				mx = max(mx, res);	}		cout << mx << '\n'; }  signed main(){	ios :: sync_with_stdio(false);	cin.tie(0);cout.tie(0);	int t;	cin >> t;	while (t -- )	{		solved();	} 		return 0;} /* stuff you should look for 你应该寻找的东西 * int overflow, array bounds (int)溢出,数组边界 * special cases (n=1?) 特殊情况(n=1?) * do smth instead of nothing and stay organized 做一些事情而不是什么也不做,保证效率 * WRITE STUFF DOWN 将东西写下 * DON'T GET STUCK ON ONE APPROACH 不要在一个地方死磕 */

     


    __EOF__

  • 本文作者: Luli&
  • 本文链接: https://www.cnblogs.com/msluli/p/16905928.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    elasticsearch 映射
    可转债市场和发行体制——市场的结构、发行方式、市场参与者与角色
    makefile中编写查询文件夹是否存在以及创建
    MySql基础篇——窗口函数和公用表达式
    自动化运维:Ansible基础与命令行模块操作
    欧科云链联合FT中文网与香港大学,探寻Web3未来安全合规之路
    java kafka客户端何时设置的kafka消费者默认值
    Linux 提权-MySQL UDF
    【论文精读5】MVSNet系列论文详解-Point-MVSNet
    [运维]如何快速压缩一个数据库的硬盘占用大小(简单粗暴但有效)
  • 原文地址:https://www.cnblogs.com/msluli/p/16905928.html