cstring

T139631 T3 阶乘之和

感情迁移 提交于 2020-07-28 02:48:10
题目描述 给定一个非负整数 n,请你判断 n 是否可以由一些非负整数的阶乘相加得到。 输入格式 有若干组数据。每行一个整数 n,保证 n<1000000。 以负数结束输入。 输出格式 对于每组数据输出一行,若可以则输出‘YES’,否则输出‘NO’。 输入输出样例 输入 #1复制 9 -1 输出 #1复制 YES 7/20 校内测模拟T3 差点就离 (l ì ) 开 (k ǎi) 这个右袖的湍堆了 四道题两道模拟可是还是只特么100分WDNMD 话不多说这篇博客是为了UOJ题解水的 我的想法是枚举全排列 我们通过计算 (打表) 可得 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800 最后别忘了0! = 1(惨死于此 等一下... 这数据范围... n<1000000 我直接疑天下之大惑 那就是说数据只可能由0到9的阶乘构成 那我们考虑用一个10位二进制数表示选择情况 那只有1024种可能 同时用桶排思想开个420000(这十个阶乘加起来不超过420000)的布尔数组 将这1024种情况与处理出来便可以完成O(1)查询了 代码如下 #include <iostream> #include <cstdio> #include <cstring>

牌型种数

为君一笑 提交于 2020-07-27 00:11:53
小明被劫持到X赌城,被迫与其他3人玩牌。 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢? 请填写该整数,不要填写任何多余的内容或说明文字。 答案: 代码: #include <iostream> #include <cstdio> #include <cstring> #define MAX 100005 using namespace std; int c; void dfs( int k, int sum) { if (sum == 0 ) { c ++ ; return ; } if (sum < 0 || k >= 13 || ( 13 - k) * 4 < sum) return ; for ( int i = 0 ;i <= 4 ;i ++ ) { dfs(k + 1 ,sum - i); } } int main() { dfs( 0 , 13 ); cout << c; } 来源: oschina 链接: https://my.oschina.net/u/4309418/blog/4422602

LCA 最近公共祖先 ( Tarjan算法详解+模板代码 )(转)

生来就可爱ヽ(ⅴ<●) 提交于 2020-07-26 05:02:21
一.LCA详解 转自: https://www.cnblogs.com/ECJTUACM-873284962/p/6613379.html 首先是最近公共祖先的概念(什么是最近公共祖先?):     在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点。     换句话说,就是两个点在这棵树上距离最近的公共祖先节点。     所以LCA主要是用来处理当两个点仅有唯一一条确定的最短路径时的路径。     有人可能会问:那他本身或者其父亲节点是否可以作为祖先节点呢?     答案是肯定的,很简单,按照人的亲戚观念来说,你的父亲也是你的祖先,而LCA还可以将自己视为祖先节点。     举个例子吧,如下图所示4和5的最近公共祖先是2,5和3的最近公共祖先是1,2和1的最近公共祖先是1。      这就是最近公共祖先的基本概念了,那么我们该如何去求这个最近公共祖先呢?     通常初学者都会想到最简单粗暴的一个办法:对于每个询问,遍历所有的点,时间复杂度为O(n*q),很明显,n和q一般不会很小。     常用的求LCA的算法有:Tarjan/DFS+ST/倍增     后两个算法都是在线算法,也很相似,时间复杂度在O(logn)~O(nlogn)之间,我个人认为较难理解。     有的题目是可以用线段树来做的

【C++养成计划】深入数组和字符串(Day8)

一曲冷凌霜 提交于 2020-07-23 23:52:28
写在前面:大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我 热爱AI、热爱分享、热爱开源 ! 这博客是我对学习的一点总结与记录。如果您也对 深度学习、机器视觉、算法、Python、C++ 感兴趣,可以关注我的动态,我们一起学习,一起进步~ 我的博客地址为: 【AI 菌】的博客 上一篇: 【C++养成计划】玩转数字——数学运算函数/随机数(Day7) 昨天,我们学习了对有关数字的一常用些操作;今天来一起探索C++中两种最基本的数据结构:数组和字符串。 文章目录 1. 初探数组 (1) 什么是数组 (2) 数组的存储方式 (3) 声明和初始化数组 (4) 访问数组中的数据 2. 多维数组 (1) 声明和初始化 (2) 访问多维数组的元素 3. 动态数组 4. C风格字符串 (1) C风格字符串中的风险 (2) C风格的字符串函数 5. C++中的String类 1. 初探数组 (1) 什么是数组 在C++中,数组让你可以按照顺序将一系列相同类型的数据存储到内存中。 数组具有如下几个特点: 数组是一系列元素 数组中所有元素的类型都相同 这组元素组成一个完整的集合 (2) 数组的存储方式 数组的存储方式和图书馆中存放书的方式是类似的。想想书架上某一排上存放的书籍,这就是一个一维数组,因为它只沿着一个维度延伸。每本书都是一个数组元素,而书架就是为存储这些书籍而预留的内存。 同样的道理

Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

自古美人都是妖i 提交于 2020-05-09 12:22:14
考场上只做出了ABDE C都挂了。。。 题解: A 题解: 模拟 判断前面一段是否相同,后面一段是否相同,长度是否够(不能有重叠) Code: 1 #include<stdio.h> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<vector> 6 #include<map> 7 #include< set > 8 #include<cmath> 9 #include<iostream> 10 #include<queue> 11 #include< string > 12 using namespace std; 13 typedef long long ll; 14 typedef pair< int , int > pii; 15 typedef long double ld; 16 typedef unsigned long long ull; 17 typedef pair< long long , long long > pll; 18 #define fi first 19 #define se second 20 #define pb push_back 21 #define mp make_pair 22 #define rep(i,j,k) for

洛谷 P2622 关灯问题II(状压DP入门题)

允我心安 提交于 2020-05-09 07:48:08
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解:    相关变量解释: 1 int n,m; 2 int a[maxn][ 20 ]; // a[i][j] : 第i个开关对第j个灯的效果。 3 bool vis[R( 10 )]; // vis[i] : 判断状态i是否被访问过 4 struct Node 5 { 6 int status; // 状态 7 int minTimes; // 来到当前状态按下开关的最小次数 8 Node( int a= 0 , int b= 0 ):status(a),minTimes(b){} 9 }; 10 queue<Node >myqueue; // 用队列中的状态去解锁其他为解锁(访问)过的状态,并能保证被解锁的状态的minTimes最小    步骤:   (1):将Node( (1<<n)+1,0 ) 加入队列,因为初始等全是亮的,对应到二进制就是n个1,并且需要 0 次按下开关。   (2):从队头依次弹出元素,并用当前状态去解锁其他状态,并能保证被其解锁的状态的minTimes是最小的。   (3):重复(2)过程,直到找到 0 状态或队列为空 AC代码: 1 #include<iostream> 2 #include<cstdio> 3 #include

洛谷 P2622 关灯问题II (状压入门)

心已入冬 提交于 2020-05-09 07:47:42
题目描述 现有n盏灯,以及m个按钮。每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果。按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时候,把它关上,否则不管;如果为-1的话,如果这盏灯是关的,那么把它打开,否则也不管;如果是0,无论这灯是否开,都不管。 现在这些灯都是开的,给出所有开关对所有灯的控制效果,求问最少要按几下按钮才能全部关掉。 输入输出格式 输入格式: 前两行两个数,n m 接下来m行,每行n个数,a[i][j]表示第i个开关对第j个灯的效果。 输出格式: 一个整数,表示最少按按钮次数。如果没有任何办法使其全部关闭,输出-1 输入输出样例 输入样例#1: 复制 3 2 1 0 1 -1 1 0 输出样例#1: 复制 2 说明 对于20%数据,输出无解可以得分。 对于20%数据,n<=5 对于20%数据,m<=20 上面的数据点可能会重叠。 对于100%数据 n<=10,m<=100 终于开始看状压了,边看题解边写的。此题bfs暴力可得,枚举每一次关灯后的结果,记录去重,以(1<<n-1)为起点。 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<map> 6

CF1285B Just Eat It! (最大连续子段和)

安稳与你 提交于 2020-05-08 14:57:23
Just Eat It! 思路:最大连续子段和:判断前缀和是否大于0,如果大于0对后面有贡献,否则置0. #include <cstdio> #include <iostream> #include <cstdio> #include <algorithm> #include <functional> #include < set > #include <vector> #include <queue> #include <cstring> #include <stack> #include <climits> using namespace std; #define ll long long #define pb push_back #define fi first #define se second void solve(){ int T; cin >> T; while (T-- ){ int n; cin >> n; vector < int > a(n); ll sum = 0 ; for (auto& x : a){ cin >> x; sum += x; } vector <ll > dp(n + 1 ); ll Max = -1e9 * 1e5 - 1e9; for ( int i = 1 ; i < n; ++ i){ if (dp[i - 1 ] + a[i -

CF1285B Just Eat It! (最大连续子段和)

冷暖自知 提交于 2020-05-08 14:33:41
Just Eat It! 思路:最大连续子段和:判断前缀和是否大于0,如果大于0对后面有贡献,否则置0. #include <cstdio> #include <iostream> #include <cstdio> #include <algorithm> #include <functional> #include < set > #include <vector> #include <queue> #include <cstring> #include <stack> #include <climits> using namespace std; #define ll long long #define pb push_back #define fi first #define se second void solve(){ int T; cin >> T; while (T-- ){ int n; cin >> n; vector < int > a(n); ll sum = 0 ; for (auto& x : a){ cin >> x; sum += x; } vector <ll > dp(n + 1 ); ll Max = -1e9 * 1e5 - 1e9; for ( int i = 1 ; i < n; ++ i){ if (dp[i - 1 ] + a[i -

SDNU 1100.字符串查找(水题)

自作多情 提交于 2020-05-08 07:46:49
Description 给定两个字符串a、b,求b在a中出现的位置。 Input 第一行为一个字符串a,长度大于等于1小于等于100000。 第二行为一个字符串b,长度大于等于1小于等于1000。 Output 一个整数,b在a中出现的位置,若b不是a的字串,输出-1。 Sample Input abababc ababc Sample Output 3 #include <cstdio> #include <iostream> #include < string > #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <map> #include <vector> using namespace std; #define ll long long char a[ 100000 + 8 ],b[ 1000 + 8 ]; int main() { scanf( " %s " , a); scanf( " %s " , b); int sign; bool flag; int len1 = strlen(a), len2 = strlen(b); for ( int i = 0 ; i<len1-len2+ 1 ; i++ ) { flag = 0 ; int j; for