st

区间合并

风格不统一 提交于 2020-01-22 10:02:49
题目链接:https://www.acwing.com/problem/content 题意 :给定 n 个区间 [li,ri],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:[1,3]和[2,6]可以合并为一个区间[1,6]。 数据范围 1≤n≤100000, −109≤li≤ri≤109 输入样例: 5 1 2 2 4 5 6 7 8 7 9 输出样例: 3 思维 :其实还是有点像贪心的思维啊。我们把所有的区间按照左端点由小到大排序,有重叠的就不断更新右端点,直到形成一个独立区间后存入答案res中,再把左端点更新为下一个独立起点……如此下去res的size就是最总答案啦!! 代码实现: # include <bits/stdc++.h> using namespace std ; typedef long long ll ; typedef pair < int , int > PII ; const int INF = 0x3f3f3f3f ; const int MAXN = 1e5 + 5 ; int n ; void merge ( vector < PII > & s ) { vector < PII > res ; sort ( s . begin ( ) , s . end ( ) ) ; int st = -

全排列

北城余情 提交于 2020-01-21 23:52:12
【题目描述】 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有‘a’ <‘b’ < … <‘y’<‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。 【输入】 只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。 【输出】 输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义: 已知S=s1s2…sk,T=t1t2…tk,则S<T等价于,存在p(1≤p≤k),使得s1=t1,s2=t2,…,sp−1=tp−1,sp<tp成立。 【输入样例】 abc 【输出样例】 abc acb bac bca cab cba 【提示】 本题目禁止使用STL及包含可以使用的相关调用。 题目分析: 对于排序方法我用的是插入法,也就是从集合中抽取一个元素与另外的元素排列。 比如说abc,我可以从中抽取a插入到bc的前面,中间或者后面,也就是abc,bca,bac。 # include <iostream> # include <string> using namespace std ; string s [ 10001 ] ; int q = 1 ; void sort ( int , int ) ; //为了按照字典序排列而设置的数组排序函数。这里我用的是冒泡排序。 void pai (

LintCode 193: Longest Valid Parentheses (Stack 和 DP)

依然范特西╮ 提交于 2020-01-21 15:52:47
Longest Valid Parentheses Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring. Example Example 1: Input: “(()” Output: 2 Explanation: The longest valid parentheses substring is “()” Example 2: Input: “)()())” Output: 4 Explanation: The longest valid parentheses substring is “()()” 解法1:stack 这题比单纯判断字符串是否合法要复杂一些。一开始我的思路就是遇到’(’就压栈,遇到’)'就出栈,同时count+2。但看看input=")(()(()"就知道了,这个方法会返回4(因为遇到2个()),但实际答案为2,因为这2个()没有连在一起。 参考了网上的答案。这题要注意记录一个合法序列开始时候的position! 当遇到’('时,压栈; 当遇到’)'时, 2.1) 如果栈为空,那么说明此时input已经不合法了,startPos从下一个位子开始算。

Educational Round 37 补题记录

ぃ、小莉子 提交于 2020-01-21 15:06:31
A Water The Garden 没啥好说的。 B Tea Queue 没啥好说的。 C Swap Adjacent Elements 题意大概就是给一个置换,有一些位置上是可以交换的,问能不能换成一个1 2 3 4 5...这样的置换。 好坑啊,一开始猜了个结论,以为对逆序产生贡献的地方有1就可以了。 5 1 5 2 3 4 0100 这一组就gg了。 实际上把连续出现1的那一部份都排个序,最后再check一下,复杂度想想是可以的。 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N = 200005; 5 6 int n, a[N]; 7 char s[N]; 8 int main() { 9 scanf("%d", &n); 10 for (int i = 0; i < n; ++i) scanf("%d", a + i); 11 scanf("%s", s); 12 s[n - 1] = '0'; 13 14 int l, r; 15 l = r = -1; 16 for (int i = 0; i < n; ++i) { 17 int k = s[i] - '0'; 18 if (k) { 19 if (l != -1) r++; 20 else l = r = i; 21 } else

HDU1043 Eight

戏子无情 提交于 2020-01-20 19:14:28
题目链接:https://vjudge.net/problem/HDU-1043 简单介绍一下八数码问题: 在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 在上图中,由于右下角位置是空的,你可以移动数字,比如可以将数字6下移一位: 1~8按顺序排列的情况称为“初始状态”(如最上方图)。“八数码问题”即是求解对于任意的布局,将其移动至“初始状态”的方法。 给定一个现有的九宫格布局,请输出将它移动至初始状态的移动方法的步骤。 输入: 输入包含多组数据,处理至文件结束。每组数据占一行,包含8个数字和表示空位的‘x’,各项以空格分隔,表示给定的九宫格布局。 输出: 对于每组输入数据,输出一行,即移动的步骤。向上、下、左、右移动分别用字母u、d、l、r表示;如果给定的布局无法移动至“初始 状态”,请输出unsolvable。 如果有效的移动步骤有多种,输出任意即可。 思路: 双向BFS,简单来说就是同时进行两个BFS,但每个BFS的vis数组有了新的用途即判断另一个BFS是否达到此BFS扩展到的此刻的点,若抵达即连通。 unsolvable的情况用逆序数的奇偶性判断,因为目标状态12345678逆序数为0,所以当前态的逆序数必为偶 用康托展开记录字典序用于状态压缩(hash) # include <iostream> # include <sstream> #

022 招商银行信用卡- 鸡鸭分类问题

核能气质少年 提交于 2020-01-17 23:02:08
题目描述 农场有n只鸡鸭排为一个队伍,鸡用“C”表示,鸭用“D”表示。当鸡鸭挨着时会产生矛盾。需要对所排的队伍进行调整,使鸡鸭各在一边。每次调整只能让相邻的鸡和鸭交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:CCDCC->CCCDC->CCCCD这样就能使之前的两处鸡鸭相邻变为一处鸡鸭相邻,需要调整队形两次。 输入描述 输入一个长度为N,且只包含C和D的非空字符串。 输出描述 使得最后仅有一对鸡鸭相邻,最少的交换次数 输入 CCDCC 输出 2 问题分析 这个题目其实目的很简单,就是说要把鸡放在一端把鸭放在另一端,我们不可能真的去模拟交换,这样简直太麻烦了,而且会增加很多的时间复杂度。当然啦为了思维好想,我们还是要写一下交换程序的。 class solution : def __init__ ( self , st ) : self . st = st def adjust ( self ) : sumsC = sumsD = 0 tmp = self . st [ : ] for i in range ( len ( self . st ) ) : if self . st [ i ] == 'D' : continue elif self . st [ i ] == 'C' : j = i cont = 0 while j > 0

学生信息的各种查找方法

妖精的绣舞 提交于 2020-01-16 02:23:23
自行设计数据结构如通讯录(包括电话号码、用户名、地址, 以电话号码为关键字)、学生信息(包括学号、姓名、性别、年龄等, 以学号为关键字)、或者学生成绩(包括学号、姓名、班级、成绩等, 以学号为关键字)等等,完成以下功能: (1)建立顺序表,采用顺序查找的方法按照关键字进行查找 并显示相应的记录,并显示查找的过程即跟关键字比较的顺序,计算 查找成功情况下的平均查找长度。 (2)对无序的记录按照关键字首先排序,然后采用折半查找 的方法对数据按照关键字进行查找,并显示查找的过程即跟关键字比 较的顺序,计算查找成功情况下的平均查找长度。 (3)对块内无序、块间有序的数据首先建立索引表,采用分 块查找的方法对数据按照关键字进行查找,并显示查找的过程即跟关 键字比较的顺序,计算查找成功情况下的平均查找长度。 (4)将数据按照关键字的大小插入到二叉排序树中,在二叉 排序树中对数据进行插入、查找、删除等操作,计算查找成功情况下 的平均查找长度。 (5)建立散列表,散列函数自行设计,解决冲突的方法可以 任选线性探测、二次探测和链地址法中的一种。在散列表中对对数据 按照关键字进行查找,并显示查找的过程即跟关键字比较的顺序,计 算查找成功情况下的平均查找长度。 (6)根据实验数据分析各种查找方法的优劣及适用范围及查找性能 //顺序查找、折半查找 #include #include #include

ST表

扶醉桌前 提交于 2020-01-16 00:34:42
题目链接,洛谷P3865 https://www.luogu.com.cn/problem/P3865 题目大意:给定 n个数,有 q个询问,对于每个询问,你需要回答区间 中的最大值。 考虑暴力做法。每次都对区间 扫描一遍,求出最大值。显然,这个算法会超时。 ST表用于处理RMQ问题,处理区间最大最小值,但是因为直接暴力去扫容易TLE,所以预处理会很好,ST表示基于O(nlogn)复杂度来写的 模板代码: # include <iostream> # define ll long long # define endl '\n' # define IO ios::sync_with_stdio(false);cin.tie(0); using namespace std ; const int maxn = 1e5 + 5 ; const int lgn = 19 ; int n , q ; int lg [ maxn ] , f [ maxn ] [ 19 ] , F [ maxn ] [ 19 ] ; void init ( ) { lg [ 1 ] = 0 , lg [ 2 ] = 1 ; for ( int i = 3 ; i < maxn ; i ++ ) { lg [ i ] = lg [ i >> 1 ] + 1 ; } } void st ( ) { for (

实现:时间获取和计时

白昼怎懂夜的黑 提交于 2020-01-12 23:31:27
#include<Windows.h> #include<iostream> #define NUMSIZE 100000 using namespace std; int compare_func(const void *a, const void *b) { //接收两个任意类型的指针 return *(int *)a - *(int *)b; // 比较的是int值 所以需要转换为int类型的指针 然后再取值进行比较 } int main(int argc, char * argv[]) { SYSTEMTIME st; GetLocalTime(&st); //获取当前机器的时间赋值给结构体st cout << "[" << st.wYear << "-" << st.wMonth << "-" << st.wDay << " " << st.wHour << "时" << st.wMinute << "分" << st.wSecond << "秒]" << endl; st.wHour--; SetLocalTime(&st); //设置时间 cout << "[" << st.wYear << "-" << st.wMonth << "-" << st.wDay << " " << st.wHour << "时" << st.wMinute << "分" << st

浅谈树的直径

拈花ヽ惹草 提交于 2020-01-12 20:23:04
浅谈树的直径 定义:   树的直径指树上最长链(最远点对) 求解:    树的直径存在两种求解方式均为O(n)复杂度,其各有优劣 1.贪心法   任取一点作为起点,找到树上距离该点的最远点,记作st,再以st为起点,找到树上距离st最远的点,记作ed,st至ed即为树的直径。   (找最远点操作DFS和BFS均可)   优点:起点与终点方便获得。    缺点:负边权就GG。 inline void dfs(int now,int fa,int deep) { if(deep>res) { res=deep; ed=now; } f[now]=fa; dep[now]=deep; for(int i=head[now];i;i=a[i].nxt) { int t=a[i].to; if(t==fa) continue; dfs(t,now,deep+a[i].val); } } dfs(1,0,0); res=0; st=ed; dfs(st,0,0); 2.树型DP    任取一点作为起点,记录树上每一点向下的最远距离和非严格次远距离,直径长度即为每一点二者之和的最大值。   优点:能处理负边权。   缺点:起点终点难以记录。 inline void dfs(int now,int fa) { for(int i=head[now];i;i=a[i].nxt) { int t=a