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

推荐阅读
  • 题目链接:POJ 2777。问题描述:给定一个区域,需要进行多次涂色操作,并在每次操作后查询某个区间内的不同颜色数量。解决方案:由于题目中颜色种类不超过30种,可以利用线段树的懒惰更新策略来高效处理这些操作。通过懒惰标记,避免了不必要的节点更新,从而显著提高了算法的效率。此外,该方法还能有效应对大规模数据输入,确保在合理的时间内完成所有操作。 ... [详细]
  • 在晴朗天气条件下,对一种神奇的魔法现象进行了深入分析。该题目为原创,基准时间限制为1秒,空间限制为131072KB,分值20,属于3级难度的算法题。研究发现,这种魔法现象在阳光明媚的环境中表现得尤为显著,进一步探讨了其背后的科学原理和技术实现方法。 ... [详细]
  • 在2021-2022 ACM集训队月度编程挑战赛第二轮中,题目“最大值与最小值的选择”要求参赛者处理一个包含n个元素的数组,并给定一个整数k。任务是通过选择特定的子数组,计算并返回这些子数组的最大值和最小值之间的差值。该问题考验了选手对数组操作和优化算法的理解与应用能力。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 在Java编程中,若需实现两个整数(例如2和3)相除并保留两位小数的结果,可以通过精确计算方法来达到预期效果。具体而言,可以利用BigDecimal类进行高精度运算,确保2除以3的结果准确显示为0.66。此外,还可以通过格式化输出来控制小数位数,确保最终结果符合要求。 ... [详细]
  • BZOJ 1835: 基站位置选择问题(动态规划与线段树优化) ... [详细]
  • 在Java编程中,为了提高代码的可读性和执行效率,建议优先使用局部变量来存储方法的返回值,而不是多次调用同一个方法。这样不仅可以减少方法调用的开销,还能避免潜在的性能问题。此外,使用局部变量还可以增强代码的可维护性和调试便利性。 ... [详细]
  • 针对NOJ1102黑白图像问题,本文采用深度优先搜索算法进行详细分析与实现。该问题要求在给定的时间限制(普通Java为1000-3000毫秒)和内存限制(65536KByte)内,处理一个n×n的黑白图像。通过对图像的逐像素遍历,利用深度优先搜索算法有效地识别并标记相连的黑色区域,从而实现图像的高效处理。实验结果显示,该方法在多种测试用例中均能稳定达到预期效果,具有较高的准确性和效率。 ... [详细]
  • 求助高手调试程序,非常感谢您的支持!在编写C语言程序时遇到了一些问题,具体代码如下:```c#include #include #include #define MAX 50int t;```希望有经验的开发者能提供指导,帮助解决调试中的难题。感谢您的时间和帮助! ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 在Python中,通过实现一个便捷的函数来解码Base64编码的数据,并将其转换为数组形式。该函数能够将Base64字符串解码为字节数组,便于进一步处理。例如,可以使用如下代码片段进行解码:`base64_decode_array('6gAAAOsAAAD')`。这为处理二进制数据提供了高效且简洁的方法。 ... [详细]
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社区 版权所有