cstring

洛谷P1020 导弹拦截

笑着哭i 提交于 2020-08-10 05:26:56
此文为博主原创,转载时请通知博主,并把原文链接放在正文醒目位置。 题目链接 https://www.luogu.org/problemnew/show/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 输入输出格式 输入格式: 一行,若干个整数(个数少于100000) 输出格式: 2行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 输入输出样例 输入样例#1: 389 207 155 300 299 170 158 65 输出样例#1: 6 2 分析: 这题想要AC的话只能用单调性来做 博主还用了Dilworth定理 如果不知道Dilworth定理的话下面附上百科链接 https://baike.baidu.com/item/Dilworth%E5%AE%9A%E7%90%86/5489361?fr

CF1286A Garland

冷暖自知 提交于 2020-08-10 05:01:52
Garland 1 #include <cstdio> 2 #include <iostream> 3 #include <cstdio> 4 #include <algorithm> 5 #include <functional> 6 #include < set > 7 #include <vector> 8 #include <queue> 9 #include <cstring> 10 #include <stack> 11 #include <climits> 12 13 using namespace std; 14 15 #define ll long long 16 #define pb push_back 17 #define fi first 18 #define se second 19 20 // dp[i][j][0/1] 表示前i位数字中有j位偶数,且当前是偶/奇数 21 22 void solve(){ 23 24 // int T; 25 // cin >> T; 26 // while(T--){ 27 int n; 28 cin >> n; 29 vector< int > a(n); 30 for (auto& x : a) cin >> x; 31 vector<vector<vector< int > > > dp(n + 1 ,

大数加法(C++实现)

亡梦爱人 提交于 2020-08-09 08:34:43
最常规的大数加法 (两个数都是非负的整数) 思路: 用字符串的方式去存储我们需要计算的数 ,但是 要注意的一点就是我们是倒过来存储这个大数的 比如: 123456789 我们存储的时候是存成 987654321 为什么要这么干? 我觉得是为了便于后面我们的进位操作吧 最常规的大数加法 (两个数都是非负的整数) 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int L= 110 ; 6 string add( string a, string b) // 只限两个非负整数相加 7 { 8 string ans; 9 int na[L]={ 0 },nb[L]={ 0 }; 10 int la= a.size(); 11 int lb= b.size(); 12 // 倒叙存储 13 for ( int i= 0 ;i<la;i++ ) 14 na[la- 1 -i]=a[i]- ' 0 ' ; 15 // 倒叙存储 16 for ( int i= 0 ;i<lb;i++ ) 17 nb[lb- 1 -i]=b[i]- ' 0 ' ; 18 int lmax=la>lb? la:lb; 19 // 从个位开始计算 20 for ( int i=

洛谷 P1020 导弹拦截

天涯浪子 提交于 2020-08-09 02:37:06
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是 \le 50000 ≤ 5 0 0 0 0的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 输入格式 1 1行,若干个整数(个数 \le 100000 ≤ 1 0 0 0 0 0) 输出格式 2 2行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 输入输出样例 输入    389 207 155 300 299 170 158 65 输出 6 2 说明/提示 为了让大家更好地测试n方算法,本题开启spj,n方100分,nlogn200分 每点两问,按问给分 思路:   读过题目后发现,第一问考察了最长不上升子序列,第二问需要用到贪心。   这里主要说第一问,我最先想到的求法是这样的: 1 for ( int i= 1 ;i<=n;++ i) 2 f[i]= 1 ; // 初始化 3 for ( int i=n;i>= 1 ;--i) //

算法疑难(c++实现)---2、矩阵乘法

Deadly 提交于 2020-08-08 17:00:57
算法疑难(c++实现)---2、矩阵乘法 一、总结 一句话总结: 矩阵阵法就是按照矩阵相乘的规律,一步步来做的,也就是拿矩阵a的每一行乘以矩阵b的每一列,并且把矩阵a的每一行里面的每一个元素都和矩阵b里面每一列的每一个元素都一一相乘 Matrix multiply(Matrix a,Matrix b){ Matrix ans; ans.row = a.row; ans.column = b.column; // 遍历矩阵a的每一行 for ( int i= 1 ;i<=a.row;i++ ){ // 遍历矩阵b的每一列 for ( int j= 1 ;j<=b.column;j++ ){ // 把矩阵a的每一行里面的每一个元素都和矩阵b里面每一列的每一个元素都一一相乘 for ( int k= 1 ;k<=a.column;k++ ){ ans.v[i][j] +=a.v[i][k]* b.v[k][j]; } } } return ans; } 二、矩阵乘法 博客对应课程的视频位置:2、矩阵乘法 https://www.fanrenyi.com/video/30/281 1 /* 2 3 矩阵的乘法在算法中有很多应用, 4 比如直接考矩阵的乘法,比如用矩阵优化递推表达式等等 5 6 7 矩阵a*矩阵b 要满足矩阵a的列等于矩阵b的行 8 最后乘出来的矩阵的行为矩阵a的行 9

ROADS POJ

时光总嘲笑我的痴心妄想 提交于 2020-08-08 16:51:55
ROADS 思路:K = 10000,dijkstra复杂度O(nlogn),如果我们把不同点的不同花费拆点,即d[花费][点] = 距离,则被拆为 N*K个点,分成K层,则dijkstra复杂度O(k * (n *logn + m)),复杂度在超时边缘徘徊... #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <queue> using namespace std; #define ll long long #define pb push_back #define fi first #define se second const int N = 110 ; const int INF = 1e9; struct node{ int v, w, c; }; int n, k, m; vector <node > E[N]; int d[ 10010 ][N]; void dijkstra(){ for ( int i = 0 ; i <= 10000 ; ++ i){ for ( int j = 1 ; j <= 100 ; ++ j){ d[i][j] = INF; } } queue <pair< int , int > > que; d[ 0 ][ 1 ]

C++:字符串格式化输入之如何读入Tom Hanks,18,7817(strtok strchr sscanf 函数介绍)

╄→гoц情女王★ 提交于 2020-08-08 08:33:26
因为很少遇到不能cin>>解决的问题,加上记性很差,所以每次遇到格式化输入就一脸懵逼,要Google才行。感觉实在太丢脸了,所以这次把几个最常用的函数记录在此,希望自己记住[狗头]。 char name[20]; int id,age; // 第一步:读入buffer char buf[210]; cin.getline(buf,200); // 第二步:定义字符指针 char * p; // 第三步:分割buffer // 方法一 p = strtok(buf,","); strcpy(name,p); // 从buf中截取","字符串中任意字符前的字符串 p = strtok(NULL,","); age = atoi(p); // 参数为NULL时,函数继续上一次扫描 p = strtok(NULL,","); id = atoi(p); // atoi()字符串转整数 // 方法二 p = strchr(buf,','); // 返回buf中第一个','出现的地址 p[0] = 0; // 删掉','使字符串在名字后“结束” strcpy(name,buf); // 将p前的字符串复制到name中 sscanf(p + 1, "%d,%d",&age,&id); // 字符串格式匹配 // strtok()返回值为NULL时,未找到子字符串 // strchr(

算法导论————EXKMP

我是研究僧i 提交于 2020-08-08 02:30:58
【例题传送门: caioj1461 】 【EXKMP】最长共同前缀长度 【题意】 给出模板串A和子串B,长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](1<=i<=lenA),求出A[i..lenA]与B的最长公共前缀长度 【输入文件】 输入A,B两个串,(lenB<=lenA<=1000000) 【输出文件】 输出lenA个数,表示A[i...lenA]与B的最长公共前缀长度,每个数之前有空格 【样例输入】 aabbabaaab aabb 【样例输出】 4 1 0 0 1 0 2 3 1 0 算法分析:   学EXKMP前,必须将KMP学透,如果仍未学KMP,请出门左转【 传送门 】   我们在 KMP 算法中可以理解, p 数组是 KMP 的核心, p[i] 代表着以 i 为结尾和以开头为首的最长公共子串长度,也就是说对于 st 字符串数组的 p[i] 代表的就是 st 字符串数组从 1 开始到 p[i] 和从 i-p[i]+1 到 i 是完全相同的( st[1...p[i]]=st[i-p[i]+1...i] )   那么扩展 KMP 就高级了。一样还是 p 数组(还是原来的配方,还是熟悉的味道!),但是既然是扩展 KMP 就不要用 p ,我就改成 extend 数组了,表示的意义与普通 KMP 就大有不同。 extend[i] 表示的是以 i

poj 1816 trie树+dfs(强烈推荐,含有通配符的匹配)

混江龙づ霸主 提交于 2020-08-07 21:26:28
// https://www.cnblogs.com/buptLizer/archive/2011/09/18/2180723.html #include <iostream> #include <algorithm> #include <stdio.h> #include <cstring> using namespace std; const int N=100002; const int sonNum=28; struct nodeIdx{ int index; nodeIdx *link; nodeIdx(int i=-1,nodeIdx *l=NULL):index(i),link(l){} }; struct trieNode{ nodeIdx *pIdx; int idNums; trieNode *son[sonNum]; }; nodeIdx sIndex[N]; trieNode node[N*7],root; char pattrn[7],words[30]; int cnt=0,idxCnt=0,num=0,wordLen; bool used[N]; void insertP(char * p,int idx) { int i; trieNode *tmp=&root; while('\0' != *p) { if(NULL == tmp->son[*p-

【CQOI2008】矩阵的个数

爷,独闯天下 提交于 2020-08-07 16:47:55
反正对今天是无言。。。 Description 给出一个N行3列非负整数矩阵的各行各列之和,统计有多少个矩阵满足此条件。输出答案模10^17的值。 Input 第一行包含四个正整数N,c1, c2, c3,即行数与三列之和。第二行包含N个正整数,即各行三个数之和。每行每列之和均不超过125。 Output 仅一个数,满足条件的矩阵个数模10^17的值。 Sample Input 3 2 3 4 1 2 6 Sample Output 17 Data Constraint Hint 1<=N<=200 其实这道题就是 DP ,如果用暴搜,必爆。。。 它的思路是这样滴 我们可以发现, 只要决定了第一列和第二列的数,第三列的数就已经是确定了 那么我们就只需要考虑第一二列的数就行 那么我们需要五层循环: 1.i【1~n】,用来表示的是到第几行            2.j【0~c1】,用来表示第一列的总和            3.k【0~c2】,用来表示第二列的总和            4.x【0~min(j,a[i])】,用来表示第一列的取值,但是取值不能超过它的限制条件            5.y【0~min(k,a[i]-x)],用来表示第二列的取值,但是取值不能超过它的限制条件 在 mlg 大佬的帮助下,我成功地意识到滚动的重要性,主要是空间只给了60MB左右,易燃易爆炸?