热门标签 | 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;
}

推荐阅读
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 树链问题的优化解法:深度优先搜索与质因数分解
    本文介绍了一种通过深度优先搜索(DFS)和质因数分解来解决最长树链问题的方法。我们通过枚举树链上的最大公约数(GCD),将所有节点按其质因子分类,并计算每个类别的最长链,最终求得全局最长链。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 本文介绍如何在Spring Boot项目中集成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社区 版权所有