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

推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
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社区 版权所有