热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

每日精选Codeforces训练题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)

题目涉及三种不同类型的算法问题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)。其中,1119E的问题背景是有n种不同长度的棍子,长度分别为2^0,2^1,…,2^(n-1),每种棍子的数量为a[i]。任务是计算可以组成的三角形数量。根据三角形的性质,任意两边之和必须大于第三边。该问题可以通过贪心算法高效解决,通过合理选择棍子组合来最大化三角形的数量。

有n种长度的棍子,长度分别为2^0 ,2 ^ 1,…,2 ^ (n-1) ,每种棍子有a[i] 种,问你能组成多少个三角形。
三角形两边之和大于第三边,而2 ^ i + 2 ^ i = 2 ^ (i+1),所以两条短的边不能和一条长的边组成三角形,因此要尽量组成2条长边1条短边的情况。
一开始是从后往前处理,但是会出现问题:当前剩2个的情况下到底是让比它小的的匹配,还是让其和比它大的匹配。如1,2,2,2,2,当判断到第4个时可以选择让第四个的一个 和第五个的两个构成一个三角形,也可以构成2个却一条边的三角形。并且无法判断哪一种选择更优。
所以这种贪心策略时有问题的。
而若从前往后进行选择,首先当前最优的肯定是先把前面剩下的用2个给匹配掉,然后是自己构成3个的,然后剩下的1个或0个留给后面的解决

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mid ((l + r) >> 1)
#define Lson rt <<1, l , mid
#define Rson rt <<1|1, mid &#43; 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define _for(i,a,b) for( int i &#61; (a); i <(b); &#43;&#43;i)
#define _rep(i,a,b) for( int i &#61; (a); i <&#61; (b); &#43;&#43;i)
#define for_(i,a,b) for( int i &#61; (a); i >&#61; (b); -- i)
#define rep_(i,a,b) for( int i &#61; (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define f first
#define s second
using namespace std;
const int N &#61; 3e5 &#43; 10;
const double eps &#61; 1e-9;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
int n, len;
LL a[N];
inline LL read(){LL s&#61;0,w&#61;1;char ch&#61;getchar();while(ch<&#39;0&#39;||ch>&#39;9&#39;){if(ch&#61;&#61;&#39;-&#39;)w&#61;-1;ch&#61;getchar();}while(ch>&#61;&#39;0&#39;&&ch<&#61;&#39;9&#39;) s&#61;s*10&#43;ch-&#39;0&#39;,ch&#61;getchar();return s*w;
}
LL last, ans;
int main()
{IOS;n &#61; read();_for(i,0,n){LL a;a &#61; read();if(a / 2 >&#61; last) {ans &#43;&#61; last; a -&#61; last * 2; last &#61; 0;}else ans &#43;&#61; a / 2, last -&#61; a / 2, a %&#61; 2;ans &#43;&#61; a / 3;a %&#61; 3;last &#43;&#61; a;}cout << ans << endl;return 0;
}

C. Okabe and Boxes
简单的栈模拟
就是给你一个栈每次都加入一个数或者移除栈顶的元素移除的数的顺序必须按照1~n的顺序出栈&#xff0c;如果不满足你可以重排栈顶元素&#xff0c;问你最小需要重排的次数
我们可以假想成两个栈。如果不满足我们就将栈内的数重排放到假想的栈中&#xff0c;并把实际的栈清空&#xff08;细节要处理好就是每次remove的时候last &#43;&#43;

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mid ((l &#43; r) >> 1)
#define Lson rt <<1, l , mid
#define Rson rt <<1|1, mid &#43; 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define _for(i,a,b) for( int i &#61; (a); i <(b); &#43;&#43;i)
#define _rep(i,a,b) for( int i &#61; (a); i <&#61; (b); &#43;&#43;i)
#define for_(i,a,b) for( int i &#61; (a); i >&#61; (b); -- i)
#define rep_(i,a,b) for( int i &#61; (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define f first
#define s second
using namespace std;
const int N &#61; 3e5 &#43; 10;
const double eps &#61; 1e-9;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
int n, len;
LL str[N], top;
inline LL read(){LL s&#61;0,w&#61;1;char ch&#61;getchar();while(ch<&#39;0&#39;||ch>&#39;9&#39;){if(ch&#61;&#61;&#39;-&#39;)w&#61;-1;ch&#61;getchar();}while(ch>&#61;&#39;0&#39;&&ch<&#61;&#39;9&#39;) s&#61;s*10&#43;ch-&#39;0&#39;,ch&#61;getchar();return s*w;
}
LL last &#61; 1, ans;
int main()
{IOS;cin >> n;_for(i,0,2*n){char op[10];cin >> op;if(*op &#61;&#61; &#39;r&#39; && top &#61;&#61; 0){last &#43;&#43;;continue;}if(*op &#61;&#61; &#39;r&#39;){if(str[top - 1] &#61;&#61; last){last &#43;&#43;;top --;}else ans &#43;&#43;, top &#61; 0, last &#43;&#43;;}else cin >> str[top], top &#43;&#43;;}cout << ans << endl;return 0;
}

在这里插入图片描述
题意&#xff1a;
给你n个机器人和m组比较&#xff0c;每组有a&#xff0c;b&#xff0c;表示a的能力比b强&#xff0c;问你最少通过前多少组可以确定一个唯一的拓扑排序&#xff0c;如果无法找到满足的结果输出-1

这个我们就要理解拓扑序列的算法本质了
拓扑序列是每次从入度为0的点开始跑&#xff0c;并把与其相连的边删掉并且将下一组入度为0的点入队
那么其实我们发现我们删了一条边之后如果这条边相连的下一个点的入度为0了那么这条边就算是有贡献的&#xff0c;那么我们就用map存一下每条边的编号&#xff0c;统计一下有贡献的边最大位置在哪&#xff0c;输出结果就好
如果途中有两个点同时度数为0这说明无法确定排名

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mid ((l &#43; r) >> 1)
#define Lson rt <<1, l , mid
#define Rson rt <<1|1, mid &#43; 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define _for(i,a,b) for( int i &#61; (a); i <(b); &#43;&#43;i)
#define _rep(i,a,b) for( int i &#61; (a); i <&#61; (b); &#43;&#43;i)
#define for_(i,a,b) for( int i &#61; (a); i >&#61; (b); -- i)
#define rep_(i,a,b) for( int i &#61; (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define f first
#define s second
using namespace std;
const int N &#61; 3e5 &#43; 10;
const double eps &#61; 1e-9;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
int n, m;
inline LL read(){LL s&#61;0,w&#61;1;char ch&#61;getchar();while(ch<&#39;0&#39;||ch>&#39;9&#39;){if(ch&#61;&#61;&#39;-&#39;)w&#61;-1;ch&#61;getchar();}while(ch>&#61;&#39;0&#39;&&ch<&#61;&#39;9&#39;) s&#61;s*10&#43;ch-&#39;0&#39;,ch&#61;getchar();return s*w;
}
struct node {int to, next;
}e[N];
int head[N], cnt;
int d[N];
map<PII,int> mp;
inline void add(int from, int to)
{e[cnt] &#61; {to,head[from]};head[from] &#61; cnt &#43;&#43;;
}int tuopusort()
{queue<int> q;_for(i,1,n&#43;1)if(d[i] &#61;&#61; 0)q.push(i);int maxv &#61; -1;while(!q.empty()){if(q.size() >&#61; 2) return -1;int u &#61; q.front();q.pop();for(int i &#61; head[u]; ~i; i &#61; e[i].next){int v &#61; e[i].to;d[v] --;if(!d[v]) q.push(v), maxv &#61; max(mp[{u,v}],maxv);}}return maxv;
}int main()
{IOS;ms(head,-1);cin >> n >> m;_for(i,0,m){int l, r;cin >> l >> r;add(l,r);mp[{l,r}] &#61; i &#43; 1;d[r] &#43;&#43;;}cout << tuopusort();return 0;
}

推荐阅读
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文探讨了如何高效地计算数组中和为2的幂的偶对数量,提供了从基础到优化的方法。 ... [详细]
  • Spring Boot使用AJAX从数据库读取数据异步刷新前端表格
      近期项目需要是实现一个通过筛选选取所需数据刷新表格的功能,因为表格只占页面的一小部分,不希望整个也页面都随之刷新,所以首先想到了使用AJAX来实现。  以下介绍解决方法(请忽视 ... [详细]
  • 深入解析Python进程间通信:Queue与Pipe的应用
    本文详细探讨了Python中进程间通信的两种常用方法——Queue和Pipe,并通过具体示例介绍了它们的基本概念、使用方法及注意事项。 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • Spring Boot + RabbitMQ 消息确认机制详解
    本文详细介绍如何在 Spring Boot 项目中使用 RabbitMQ 的消息确认机制,包括消息发送确认和消息接收确认,帮助开发者解决在实际操作中可能遇到的问题。 ... [详细]
  • Redis 是一个高性能的开源键值存储系统,支持多种数据结构。本文将详细介绍 Redis 中的六种底层数据结构及其在对象系统中的应用,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象。通过12张图解,帮助读者全面理解 Redis 的数据结构和对象系统。 ... [详细]
  • 本题涉及一些特殊情况,例如黑白块数不相等的情况,这些情况不满足二分性质。对于有解的情况,可以通过特定公式直接计算出结果。本文将详细介绍如何使用网络流来解决这类问题。 ... [详细]
  • 开发笔记:树的浅析与实现 ... [详细]
author-avatar
mobiledu2502906927
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有