码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • uva 10366 - Faucet Flow(贪心)


    题目链接:uva 10366 - Faucet Flow

    题目大意:给出l和r,然后从l坐标到r坐标每隔两个位置有一个档板,给出挡板的高度,然后想(-1, 1)中间加水,问什么时候会溢出。

    解题思路:两边先找到距离(-1,1)最近的最大值L和R,因为可能存在多个最高的挡板。

    接着比较两个L和R的大小,相等的话就可以比较(-l,L的下标)和(R的下标,r)两块的大小,注意L和R一边高的话两边都会流,所以这块的时间要乘2。

    如果两边不一般高的话,找到高的一边第一个比另一边最高的那个高的p(细节比较多,自己多想一下就知道了),然后比较a = ( p,Max(R,L)的下标)和b = (Min(R,L)的下标,end)的大小,然后决定是2*b还是a+b。

    #include 
    #include 
    #include 
    
    using namespace std;
    
    const int N = 1005;
    int l, r, x[N], y[N];
    int L, R, idl, idr;
    
    void init() {
    	R = L = 0;
    	for (int i = l; i <= r; i += 2) {
    		if (i < 0) {
    			scanf("%d", &x[(-i)/2]);
    			if (L <= x[(-i)/2]) {
    				L = x[(-i)/2]; idl = (-i)/2;
    			}
    		} else {
    			scanf("%d", &y[i/2]);
    			if (R < y[i/2]) {
    				R = y[i/2]; idr = i/2;
    			}
    		}
    	}
    }
    
    int del(int a, int b) {
    	if (a <= b) return 2 * a;
    	else return a + b;
    }
    
    int solve() {
    	l = (-l) / 2; r = r / 2;
    
    	if (R == L) {
    		int k = 0, t = 0;
    		int tmp = x[l];
    		for (int i = l; i > idl; i--) {
    			k += tmp; tmp = max(tmp, x[i-1]);
    		}
    		tmp = y[r];
    		for (int i = r; i > idr; i--) {
    			t += tmp; tmp = max(tmp, y[i-1]);
    		}
    
    		return (idl + idr + 1) * R * 2 + min(k, t) * 2 * 2;
    	} else {
    		int T = min(R, L);
    		int p = 0, q = 0, k = 0, t = 0;
    		while (p < l && x[p] < T) p++;
    		while (q < r && y[q] < T) q++;
    
    		if (R > L) {
    			int tmp = y[q];
    			for (int i = q; y[i] <= L; i++) {
    				k += tmp; tmp = max(tmp, y[i+1]);
    			}
    			tmp = x[l];
    			for (int i = l; i > p; i--) {
    				t += tmp; tmp = max(tmp, x[i-1]);
    			}
    
    		} else {
    			int tmp = x[p];
    			for (int i = p; x[i] <= R; i++) {
    				k += tmp; tmp = max(tmp, x[i+1]);
    			}
    			tmp = y[r];
    			for (int i = r; i > q; i--) {
    				t += tmp; tmp = max(tmp, y[i-1]);
    			}
    		}
    		int ans = t > k ? t + k : 2 * t;
    		return ans * 2 + (p + q + 1) * T * 2;
    	}
    }
    
    int main() {
    	while (scanf("%d%d", &l, &r) == 2 && l && r) {
    		init();
    		printf("%d\n", solve());
    	}
    	return 0;
    }
    
  • 相关阅读:
    C++:无法查找或打开 PDB 文件?? 如何解决呢?以及产生原因是什么?
    赢未来杂志赢未来杂志社赢未来编辑部2022年第7期目录
    OWASP Top 10漏洞解析(1)- A1:Broken Access Control 访问控制失效
    《golang设计模式》第二部分·结构型模式-04-装饰器模式(Decorator)
    [附源码]JAVA毕业设计基于vue技术的汽车维修检测系统设计与实现(系统+LW)
    【面试题】马上金九银十了,简历该准备起来了,面试题你准备好了吗 ?浅谈 JS 浅拷贝和深拷贝
    Unity 向量
    优化算法 - 动量法
    【Python】字符串‘(25, 140, 39, 143)‘如何变为元组(25, 140, 39, 143)?有哪些方法?
    初学python自动化测试(1)-元素定位
  • 原文地址:https://blog.csdn.net/weixin_72426331/article/details/127784047
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号