Educational Codeforces Round 93 (Rated for Div. 2)题解
A. Bad Triangle
题目:https://codeforces.com/contest/1398/problem/A
题解:一道计算几何题,只要观察数组的第1,2,n个,判断他们能否构成三角形即可。
必须注意:从反方向判断时要注意:两边之和大于第三边的反向是:a[1]+a[2]<=a[n]一定注意为小于等于,两边之差小于第三边的反义是:a[n]-a[2]>=a[1]切记注意是大于等于
代码:
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int N=;
- ll t,n;
- ll a[N];
- int main()
- {
- ll i,j,k;
- cin>>t;
- while(t--)
- {
- bool flag=true;
- cin>>n;
- for(i=;i<=n;i++)
- cin>>a[i];
- if(a[]+a[]<=a[n]||a[n]-a[]>=a[])
- cout<<"1 2 "<<n<<endl;
- else
- cout<<"-1"<<endl;
- }
- return ;
- }
B. Substring Removal Game
题目:https://codeforces.com/contest/1398/problem/B
题解:一到关于字符串的贪心问题,由于我们要1的个数最大,所以只要找相邻的1的个数就好,存到数组后进行排序,由于我们是先手,因此每隔一个取一次。
代码:
- #include<bits/stdc++.h>
- using namespace std;
- int a[];
- bool cmp(int a,int b)
- {
- return a>b;
- }
- int main()
- {
- int i,t;
- string s;
- cin>>t;
- while(t--)
- {
- cin>>s;
- int len=s.length();
- int k=;
- int j=;
- for(i=;i<len;i++)
- {
- if(s[i]=='')
- k++;
- else
- {
- if(k!=)
- {
- a[j++]=k;
- k=;
- }
- }
- }
- if(k!=)
- a[j++]=k;
- int ans=;
- sort(a,a+j,cmp);
- for(i=;i<j;i++)
- {
- if(i%==)
- ans+=a[i];
- }
- cout<<ans<<endl;
- }
- return ;
- }
C. Good Subarrays
题目:https://codeforces.com/contest/1398/problem/C
题解:我认为这道题是最难想的,一开始用暴力,TLE在第三组数据。因而不能用这种方法。
在线处理的方法。
我们想想,用子数组总和减去元素个数,如果是为0,那么就是好子数组,如果好子数组中又包含好子数组呢?那么该好子数组是不是可以分为三个好子数组。
如果不为0呢?那么我们是不是可以记录这个状态,我们继续往后探索的的时候突然发现子数组总和减去元素个数又为我们上次记录过的状态。那么这个子数组是不是可以拆成我们上次记录过的状态子数组和另一个子数组减元素个数为0的好子数组?(仔细思考这里,非常重要!)
那么我们层层深入,如果一个子数组能这样分为我们已经访问过的状态子数组和一个好子数组,那么不就实现在线处理了吗?因为现在我们只要遍历一遍数组了,其他的子数组我们就可以利用当前已经记录的子数组分解获得。那么时间复杂度就大大减小了。
那么我们怎么记录之前状态呢?这里就要使用map容器了,我们标记所有计算的差值状态,利用ans统计值即可。若之前标记过两次,说明我们可以拆成两种情况:一个差值为标记过的子数组和一个好子数组
代码:
- #include<bits/stdc++.h> //POJ不支持
- #define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
- #define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
- #define pb push_back
- #define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
- #define fi first
- #define se second
- #define mp make_pair
- using namespace std;
- const int inf = 0x3f3f3f3f;//无穷大
- const int maxn = 1e5;//最大值。
- typedef long long ll;
- typedef long double ld;
- typedef pair<ll, ll> pll;
- typedef pair<int, int> pii;
- //*******************************分割线,以上为自定义代码模板***************************************//
- int main()
- {
- IOS;
- int t,n,i,j;
- string str;
- cin>>t;
- while(t--)
- {
- cin>>n;
- cin>>str;
- ll ans=,num=;
- map<int,ll>mp;
- mp[]=;//当差值为0时就是一个好数组
- rep(i,,n-)
- {
- num+=str[i]-'';//计算前缀和数组
- ans+=mp[num-(i+)];//加上当前的状态对应的值
- mp[num-(i+)]++;//记录上标记一次
- //其实好与坏的区别就在于第一个是好还是坏
- }
- cout<<ans<<endl;
- }
- return ;
- }
D. Colored Rectangles
题目:https://codeforces.com/contest/1398/problem/D
题解:DP题,我们来思考一下他们的状态转移,设我们可以构造的最大矩形数为nnn,(注意:最大矩形数是一定固定的)那么该状态的最优解是不是可以转换为矩形数为n−1n-1n−1的最优解+当前可构建矩形面积的最大值。我们用dp[i][j][k]表示用去了i个R颜色彩棒,j个G个颜色彩棒,k个C颜色彩棒,那么我们表示矩形数为n−1自然对应的彩棒数要减2了,这里注意有三种情况都要判断
需要注意的是必须对其进行排序,因为我们相当于是不断加入三根彩棒,比较当时拥有的彩棒合成矩形最大值,这就是一个矩形的最优解,再往后推,逐渐得到总矩形的最优解
代码:
- #include<bits/stdc++.h> //POJ不支持
- #define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
- #define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
- #define pb push_back
- #define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
- #define fi first
- #define se second
- #define mp make_pair
- using namespace std;
- const int inf = 0x3f3f3f3f;//无穷大
- const int maxn = ;//最大值。
- typedef long long ll;
- typedef long double ld;
- typedef pair<ll, ll> pll;
- typedef pair<int, int> pii;
- ll dp[maxn][maxn][maxn];
- int r[maxn],g[maxn],b[maxn];
- int main()
- {
- IOS;
- int R,G,B,i,j,k;
- cin>>R>>G>>B;
- rep(i,,R-)
- cin>>r[i];
- rep(i,,G-)
- cin>>g[i];
- rep(i,,B-)
- cin>>b[i];
- //排序
- sort(r,r+R);
- sort(g,g+G);
- sort(b,b+B);
- rep(i,,R)
- {
- rep(j,,G)
- {
- rep(k,,B)
- {
- if(i&&j)
- dp[i][j][k]=max(dp[i][j][k],dp[i-][j-][k]+r[i-]*g[j-]);
- if(i&&k)
- dp[i][j][k]=max(dp[i][j][k],dp[i-][j][k-]+r[i-]*b[k-]);
- if(j&&k)
- dp[i][j][k]=max(dp[i][j][k],dp[i][j-][k-]+g[j-]*b[k-]);
- }
- }
- }
- cout<<dp[R][G][B]<<endl;
- return ;
- }
Educational Codeforces Round 93 (Rated for Div. 2)题解的更多相关文章
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- Educational Codeforces Round 65 (Rated for Div. 2)题解
Educational Codeforces Round 65 (Rated for Div. 2)题解 题目链接 A. Telephone Number 水题,代码如下: Code #include ...
- Educational Codeforces Round 64 (Rated for Div. 2)题解
Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...
- Educational Codeforces Round 60 (Rated for Div. 2) 题解
Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...
- Educational Codeforces Round 58 (Rated for Div. 2) 题解
Educational Codeforces Round 58 (Rated for Div. 2) 题目总链接:https://codeforces.com/contest/1101 A. Min ...
- Educational Codeforces Round 47 (Rated for Div. 2) 题解
题目链接:http://codeforces.com/contest/1009 A. Game Shopping 题目: 题意:有n件物品,你又m个钱包,每件物品的价格为ai,每个钱包里的前为bi.你 ...
- Educational Codeforces Round 33 (Rated for Div. 2) 题解
A.每个状态只有一种后续转移,判断每次转移是否都合法即可. #include <iostream> #include <cstdio> using namespace std; ...
- Educational Codeforces Round 78 (Rated for Div. 2) 题解
Shuffle Hashing A and B Berry Jam Segment Tree Tests for problem D Cards Shuffle Hashing \[ Time Lim ...
- Educational Codeforces Round 81 (Rated for Div. 2) 题解
过了n天补的题解:D AB就不用说了 C. Obtain The String 思路挺简单的,就是贪心,但是直接贪心的复杂度是O(|s|*|t|),会超时,所以需要用到序列自动机 虽然名字很高端但是就 ...
随机推荐
- CCNA - Part10 数据包的通信过程
这篇文章主要是对数据包在同网段和不同网段的转发流程梳理,使用 ping 命令进行实际抓包测试. 网关的概念: 对于像 PC 等终端设备来说,通过交换机可以实现同网段的通信.但如果想要给其他网段发生数据 ...
- python多线程之Threading
什么是线程? 线程是操作系统内核调度的基本单位,一个进程中包含一个或多个线程,同一个进程内的多个线程资源共享,线程相比进程是“轻”量级的任务,内核进行调度时效率更高. 多线程有什么优势? 多线程可以实 ...
- 并发系列(二)——FutureTask类源码简析
背景 本文基于JDK 11,主要介绍FutureTask类中的run().get()和cancel() 方法,没有过多解析相应interface中的注释,但阅读源码时建议先阅读注释,明白方法的主要的功 ...
- VIM的常用快捷方式(尽量简洁,删去能组合实现的且不易记的)
vi可以分为三种状态,分别是一般模式.编辑模式和命令行模式 1一般模式:以vi打开一个文件就直接进入一般模式了(这是默认的模式).在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用删除字符或 ...
- Btree索引和Hash索引
B-Tree 索引 BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符, ...
- ken桑带你读源码 之scrapy
开篇声明 文章讲解源码不一定从入口开始 主题更注重 思路讲解以及核心函数 ok? 废话到此为止 /scrapy/downloadermiddlewares/ 文件夹下是下载器的 中间件 ...
- Python while 循环中使用 else 语句
Python while 循环中使用 else 语句: else:表示 while 中的语句正常执行完,然后执行 else 语句的部分. 示例: # while 判断条件: # 一行语句 或 多行语句 ...
- Workerman学习笔记(一)初步认识
本文只是概念性的知识,内容比较零散,下篇文章再进行代码分析. Workerman是什么,他的优势在哪? 官方给的解释是高性能socket框架,我的个人理解是实现多进程的通讯的服务框架. 与传统的PHP ...
- Linux分布式机器 设置机器名字
查看主机的名字: hostname 1.临时修改 [root@localhost datas]# hostname slaver 临时修改,重启服务器后就不生效了 [root@localhost da ...
- 云计算&存储测试:FIO工具入门与实战
一.关于FIO 1.1 简介 FIO是一个开源的I/O压力测试工具,主要是用来测试磁盘的IO性能,也可测试cpu,nic的IO性能.它可以支持13种不同的I/O引擎,包括:sync,mmap, lib ...