Educational Codeforces Round 101 (Rated for Div. 2)
A. Regular Bracket Sequence
题目链接:点击查看
题目大意:
给定一个由()?三种字符组成的序列,该序列中符号(和)各有一个且只有一个。其中?字符可以替换成(和)任意一个,问是否能将整个序列通过替换?使整个序列的括号匹配(一个(对应一个))。
思路:
首先判断序列长度是否与2同余,因为只有这样才能保证(和)的个数相等。若满足,将原序列中前一半的?当作(,后一半当作),再判断括号是否匹配即可。
Code:
#include<bits/stdc++.h>
#define N 101
using namespace std;
char s[N];
int main(){int T;scanf("%d ",&T);while(T--){gets(s);int len = strlen(s);if(len % 2 != 0){puts("NO");continue;}int sum = (len - 2) / 2;bool flag = false;int top = 0;for(int i = 0; i < len; i++){if(s[i] == '(') top++;else if(s[i] == '?' && sum) top++, sum--;else{if(top == 0){flag = 1;break;}top--;}}if(flag) puts("NO");else puts("YES"); }return 0;
}
B. Red and Blue
题目链接:点击查看
题目大意:
给定两个序列,有n个元素的ri和有m个元素的bi。让这两个序列拼到一起构成一个新序列ai,需保证ri中的元素在ai中的位置顺序和在ri中的顺序相同,bi也是如此。
令f(a)=max(0,a1,(a1+a2),(a1+a2+a3),…,(a1+a2+a3+⋯+an+m)),求f(a)的值。
思路:
分别求ri和bi前i项元素和的最大值ans1和ans2,二者相加即答案。
Code:
#include<bits/stdc++.h>
using namespace std;
int n, m, ans;
int r, b;
int sum1, sum2, ans1, ans2;
int main(){int T;scanf("%d", &T);while(T--){ans1 = ans2 = 0;sum1 = sum2 = 0;scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%d", &r);sum1 = sum1 + r;ans1 = max(sum1, ans1);}scanf("%d", &m);for(int i = 1; i <= m; i++){scanf("%d", &b);sum2 = sum2 + b;ans2 = max(sum2, ans2);}printf("%d\n", ans1 + ans2);}return 0;
}
C. Building a Fence
题目链接:点击查看
题目大意:
想要建造一个由n个相同部分组成的栅栏,这个栅栏每一部分都是宽为1高为k的矩形。但是栅栏所在的地面不平坦,第i个部分下面的地面高度为hi。
栅栏的建造需满足一下三个条件:
1.栅栏相邻的部分至少要有1长度的公共边。
2.栅栏的第一部分和第n部分必须立在相应的地面上。
3.其他部分可以不立在地面上,但与相应的地面的距离最大为
k-1。
问是否能建造这样的一个栅栏。
思路:
从栅栏的第二部分起,计算栅栏每部分可能的高度范围,若最低高度l大于最高高度r,则无法满足。同时,栅栏的最后一部分相应地面的高度应位于其可能的高度范围内,否则同样无法满足。
Code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,k,h;
int main(){int T;scanf("%d",&T);while(T--){scanf("%d%d", &n, &k);scanf("%d", &h);bool flag = false;ll l = h, r = h;for(int i = 1; i < n; i++){scanf("%d", &h);ll t1 = l - (k - 1), t2 = r + (k - 1);t1 = max((ll)h, t1);t2 = min((ll)h + k - 1, t2);l = t1;r = t2;if(l > r) flag = 1;}if(flag || h < l || h > r) puts("NO");else puts("YES");}return 0;
}
D. Ceil Divisions
题目链接:点击查看
题目大意:
给定一个序列ai,其中ai = i。
在一步操作中, 可以选择1到n范围内的两个数x,y(x != y),将ax的值改变为[ax/ay] (向上取整),目标将ai序列改变为由n-1个1和1个2组成的序列。输出操作次数以及操作方案。 要求操作次数不超过n + 5次。
思路:
显然,对于数x,y:
操作1.若x <= y,则操作1次ax被改变为1。
操作2.若x > y且x <= y * y,则操作1次可将ax改变为2,操作2次可将ax改变为1。
操作3.若x > y * y,则需操作2次以上才可将ax改变为1。
用贪心的思维来想,若想操作次数尽可能的少,则x应尽可能小于等于y * y。
想要得到1很简单,只需要使y等于n,任何不能与n的x进行一次操作后都可以变成1。但是这样一来an就无法改变。
所以现在的问题是如何改变an。
我们首先考虑如何得到序列最终的一个2:
如果2是由第2种方式得到,那么一定会使得序列中存在多个2或存在除1,2以外的数,故最终的2应该是原来就存在的a2,得到2需要0次操作。
下面考虑如何在n + 5次操作内得到n - 1个1。
既然a2保留到了最后,那么我们不妨从它延伸:
- 通过a2将a4改变成1需要2次操作
- 通过a4将a16改变成1需要2次操作
- 通过a16将a256改变成1需要两次操作
- 通过a256将a65536改变成1需要两次操作
这样a4,a16,a256,a65536在两次操作内可以变成1,同时an可以通过这四个数以及a2中小于n且距n最近的一个数改变成1,最多只需2次操作。
这样,在最坏的情况下,a4,a16,a256,a65536,an这五个数最多只需要两次操作可以改变成1,除2外其他数可以通过1次操作改变成1,2不需要改变,总共n + 4次操作,满足条件!
Code
#include<bits/stdc++.h>
#define N 200001
using namespace std;
bool vis[N];
int tmp[N], ans1[N] , ans2[N];
int n, t, num, numt;
int main(){int T;long long t = 2;while(t <= N - 1){vis[t] = 1;t *= t;}scanf("%d", &T);while(T--){scanf("%d", &n);t = 2;num = numt = 0;bool st = vis[n];vis[n] = 1;for(int i = 1; i <= n; i++){if(vis[i]) tmp[++numt] = i;else{ans1[++num] = i;ans2[num] = n;}}for(int i = numt; i >= 2; i--){ans1[++num] = tmp[i];ans2[num] = tmp[i - 1];ans1[++num] = tmp[i];ans2[num] = tmp[i - 1];}printf("%d\n", num);for(int i = 1; i <= num; i++){printf("%d %d\n", ans1[i], ans2[i]);}vis[n] = st;}return 0;
}
写在最后
本人是来自HITWH的一名ACMER,第一次写博客,希望和大家多多交流,共同进步。
Educational Codeforces Round 101 (Rated for Div. 2)相关推荐
- Educational Codeforces Round 101 (Rated for Div. 2) C. Building a Fence 思维取范围
传送门 题意: 思路: 刚看到这个题其实是没什么思路,想过从前往后推或者从后往前推,但是都不是很可行.因为两边都有一个固定的挡板挡住,我们可以根据其中的一个算出来每个位置高度的范围,让后检查一下范围是 ...
- Educational Codeforces Round 101 (Rated for Div. 2) F. Power Sockets 哈希 + 乱搞
传送门 题意: 给一个二进制串aaa,让后定义两个串相似为有至少一个相同位置相等.现在让你找一个字典序最小的长度为kkk的串使其与aaa中每个长度为kkk的字串相似. 思路: 首先我们知道所有可能的串 ...
- Educational Codeforces Round 101 (Rated for Div. 2) D. Ceil Divisions 思维 + 根号数
传送门 题意: 给一个数组ai=ia_i=iai=i,每次可以进行操作ax=⌈axay⌉a_x=\left \lceil \frac{a_x}{a_y} \right \rceilax=⌈aya ...
- Educational Codeforces Round 101 (Rated for Div. 2) D. Ceil Divisions(思维)
给出数 n ,数组 a 为 {1,2,3,--n},最多有 n+5 次机会,将任意两个不相等的数做 ceil(x/y) 运算,使得最后的数组 a 只有一个 2,其余全为 1,给出运算次数具体的运算步 ...
- Educational Codeforces Round 126 (Rated for Div. 2)(A-E)
A-Array Balancing 题意:给定两个数组a,b,a数组第i个数可以和b数组的第i个数交换,最终求 a1−a2|+|a2−a3|+⋯+|an−1−an||a1−a2|+|a2−a3|+⋯+ ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- Educational Codeforces Round 37 (Rated for Div. 2) 1
Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...
- Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)
Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...
- Educational Codeforces Round 89 (Rated for Div. 2)(A, B, C, D)
Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords 思路 题意非常简单,就是得到最多的物品嘛,我们假定a, ...
最新文章
- nyoj——297(期望)
- 如何终止一个正在动态执行的命令
- 失败在大学生活中的三种功能
- GATT之Device information Service
- 中北大学和陕西科技大学计算机专业,西北地区两所重点大学,中北大学和陕西科技大学...
- 机器人带陀螺仪走钢丝_一言不合就走钢丝,机器人化身“七变美男子”,萌翻你!...
- 各大物联网通信技术对比
- linux专业画图工具astah下载和安装
- Telink 825x 蓝牙开发笔记4
- 什么服务器操作系统更好?四大流派有这些!
- 抖音能成为下一个「微信」吗?
- TreeMap的用法
- 硬件电路设计-FPGA(EP4CE6)最小系统
- 如何计算机械费里有多少电费,企业用电的电费是如何计算
- Qt之简约按钮导航栏
- FastAdmin 系统配置的使用
- 远禾科技出席阿里ASRC生态大会 并参与安恒西湖论剑...
- repo命令添加bin_Linux shell中getopts命令学习--实现一个添加yum源的脚本
- n个点坐标解三角形个数
- 时间格式化hh:mm:ss和HH:mm:ss
热门文章
- 群面时被问到“让你淘汰一个组员”一般如何淘汰谁?
- 单片机指令系统(1)
- 证件照尺寸像素规格,证件照尺寸怎么修改
- lamp架构部署 httpd编译、mysql二进制、php编译 网页访问效果
- linux+qq+输入法下载官网,续:Linux下安装输入法和QQ软件
- 【草莓音乐节】现场美女大放送
- 河南大学计算机科学与技术中外合作,河南大学中外合作办学怎么样
- vscode markdown preview enhanced css font
- 从亏损19亿到盈利6亿,恺英网络做对了什么?
- Vue学习笔记:获取文件唯一标识 md5值