cstring

洛谷 P1018 乘积最大

房东的猫 提交于 2020-08-07 13:20:27
P1018 乘积最大 题目描述 今年是国际数学联盟确定的“ 2000 2 0 0 0 ――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 90 9 0 周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 XZ X Z 也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为 N N 的数字串,要求选手使用 K K 个乘号将它分成 K+1 K + 1 个部分,找出一种分法,使得这 K+1 K + 1个部分的乘积能够为最大。 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串: 312 3 1 2 , 当 N=3,K=1 N = 3 , K = 1 时会有以下两种分法: 1、 3 \times 12=36 3 × 1 2 = 3 6 2、 31 \times 2=62 3 1 × 2 = 6 2 这时,符合题目要求的结果是: 31 \times 2 = 62 3 1 × 2 = 6 2 现在,请你帮助你的好朋友 XZ X Z 设计一个程序,求得正确的答案。 输入输出格式 输入格式: 程序的输入共有两行: 第一行共有 2 2 个自然数 N,K N , K ( 6≤N≤40,1≤K≤6 6 ≤ N ≤ 4 0 , 1 ≤ K ≤ 6 ) 第二行是一个长度为 N N 的数字串。 输出格式:

ICPC Pacific Northwest Regional Contest 2016 C. Buggy Robot

此生再无相见时 提交于 2020-08-06 23:37:34
Buggy Robot    思路:dp[inx][x][y],表示用了前inx个指令后的最小费用。 对于一个指令,我们可以选择不走或者走,其他的我们可以添加四个方向的指令与使用过指令后的dp来比较。 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <queue> 5 #include <cstring> 6 7 using namespace std; 8 9 const int N = 60 ; 10 const int INF = 1e9; 11 int mv_x[] = { 1 , - 1 , 0 , 0 }; 12 int mv_y[] = { 0 , 0 , - 1 , 1 }; 13 char mp[N][N]; 14 int dp[N][N][N]; 15 char str[N]; 16 int n, m; 17 18 struct node 19 { 20 int inx, x, y; 21 }R, E; 22 23 bool inline check( int x, int y) 24 { 25 return x >= 0 && x < n && y >= 0 && y < m; 26 } 27 28 void bfs() 29 { 30 for ( int

常见字符类型转换持续更新中

a 夏天 提交于 2020-08-06 22:22:43
QString ----->wchar_t* && wchar_t* -----> QString QString szPath = "123456"; // wchar_t 为宽字符类型,一个字符占两个字节 ,unsigned short无符号短整型,一个整形占两个字节 (1)const wchar_t * encodedName = reinterpret_cast<const wchar_t *>(szPath.utf16()); (2)const wchar_t * encodedName = reinterpret_cast<const wchar_t *>(szPath.data()); szPath = QString::fromWCharArray(encodedName); const char* ------>QString && QString ------> char* const char* p ="123,你好"; //在window下VS中一个中文字符占两个字节,Qt下一个中文占三个字节 QString str; (1)str = QString(p); (2)str = QString::fromUtf8(p); (3)str = QString("%1").arg(p); p = str.toUtf8().data(); QChar-----

多边形——————区间dp

心不动则不痛 提交于 2020-08-06 20:05:18
  题意简单来说就是:给你一个环,断掉一条边使其成为一个链,用这个链跑dp,求最大得分。 首先这不是一道板子题。。。跟板子区别如下: 1.多了一重循环,最开始要求断掉一条边,但是我们不知道要断掉哪一条边,因此需要循环一遍来比较。 2.计算方法有加法有乘法,而且数据有正数有负数。这两个条件任意一个都不足惧,但是如果凑在一起。。。就很微妙了。   何出此言?比如说,我们用 f [ i ] [ j ]来表示从i号点到j号点的最大得分。那么假如,最后一次的运算是乘法。你在最后一次计算的时候,用于相乘的两个数,肯定都是它们各自那个区间的最优解,也就是最大的。然而,假如说在这个过程中,你淘汰了一些负数的值,那就很危险了。比如,你最后选择了1000和100相乘,但是本来你可以让-10000和-3000相乘的,那不就直接gg了吗。。   负负得正,真是麻烦。。。。   那怎么解决呢?其实也简单。只要另开一个数组记录最小得分即可~~; 3.题目还要求: 有些边如果在首次移动中被删除,可以导致最高得分。在输出文件的第二行,要求列举出所有这样的边,而且按照升序输出,其间用一个空格分开。(这句话直接粘贴的),也就是说,我们需要用一个数组把每条边和断掉该条边所能获得的最大得分匹配起来,以便最后比较。 说的差不多了,上代码: 1 #include <cstdio> 2 #include <algorithm>

luoguP1036 选数 暴力AC题解

北城余情 提交于 2020-08-06 12:06:15
luoguP1036 选数 暴力AC题解(非正解) 俗话说得好:暴力出奇迹,打表拿省一。 对于一些暴力就能拿分的题,暴力就好啦QWQ 题目描述 输入格式 输出格式 输入输出样例 定义变量 我们令输入的第一行分别为 n , k ; 第二行的数由 a [ 25 ] 来存储。 long long n,k,a[ 25 ]; 题目分析 1)制作素数筛子   看完这个题之后,我们需要用到一个判断素数的筛子。可以定义一个函数,如果是素数就返回1,否则返回0.   判断一个数是不是素数的方法也有很多种。我用的属于直观判断法。   根据定义,因为质数除了1和本身之外没有其他约数。我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,代码中并不需要遍历到 n-1 ,遍历到 sqrt(n) 即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。 bool prime( long long y) { if (y== 1 ||!y) return 0 ; // 判断1和0的情况 for ( int i= 2 ;i<=sqrt(y);i++ ) if (!(y%i)) return 0 ; // 判断 y%i 是不是=0,如果值为0说明能被整除,不是素数 return 1 ; // 遍历完之后如果没有返回0,则返回1. }

Bron–Kerbosch算法-最大独立集与最大团

笑着哭i 提交于 2020-08-06 05:27:13
---恢复内容开始--- Bron - Kerbosch 算法计算图的最大全连通分量(团clique) 最大独立集: 顶点集V中取 K个顶点,其两两间无连接。 最大团: 顶点集V中取 K个顶点,其两两间有边连接。 最大团中顶点数量 = 补图的最大独立集中顶点数量 补图定义:   G = <V, E>     the complement of G, \bar{G} = <V, V \times V - E>          详见连接: http://zh.wikipedia.org/wiki/%E8%A3%9C%E5%9C%96     更详细的: http://en.wikipedia.org/wiki/Bron%E2%80%93Kerbosch_algorithm      就可以通过求其补图中最大团中顶点数量,就可得出原图中最大独立集中顶点数量了. 对于求解 最大团中顶点数量 的搜索过程中用到的剪枝,如下 1 . 剪枝1:常用的指定顺序, 即枚举第i个顶后, 以后再枚举时枝考虑下标比大它的, 避免重复。 2 . 剪枝2:自己开始从前往后的枚举顶点, TLE两次. 后来从后往前枚举顶点,发现可以利用顶点之间的承袭性.我用num[i] 记录的可选顶点集合为 V[i, i+ 1 , ... , n] 中的最大团数目, 目标是求num[ 1 ]. 分析易知, num[i] =

记一次蛋疼的Raw socket发送经历。附:Raw socket编程总结

孤街醉人 提交于 2020-08-05 01:17:32
最近在做信息安全导论的实验,实验很简单,就是实现一个ping程序,能够扫描主机是否打开的情况,但是,我也就纳了闷了,每次有个不易发现的bug(可能由于自己知识有限造成的),都得让我碰上,并且还得为这个bug操心好长时间,才能解决。。。。。。(抱怨是最浪费时间的一种行为!)ok~为了下次不再犯同样的错误,现在先记录一下吧~ 我的错误是,在一切都准备好了的时候(初始化套接字,创建套接字,填充icmp数据头,设定超时时间)发送数据包,成功,但是一旦接受就会超时,为此,我找了个能发送成功的程序,一步步的对照着看看哪儿不一样,但是对照完了,发现一些核心代码是一样的。。。。。。这就蛋疼了,然后我就怀疑是不是因为这些小的错误导致的呢?我一步步的改正,首先我怀疑我的可能是因为发送和接受我放在了不同的函数里面,导致,在一个函数返回的时间里,接受函数错过了接受(现在想想真是有病乱投医啊。。。。。。。操作系统在端口应该有缓存的吧,在接受到数据后,会存到缓存里,然后才会调用。。。。。)我就把所有函合并成了一个函数,果不其然,没有任何效果,依旧是发送超时。在经历无尽的折磨以后,我发现我的变量全是定义在类里面的,而其他的程序就是在函数里面直接声明,或者就是全局变量的,难道是因为类,半信半疑我就把所有定义在类里面的变量放到了cpp文件当中,作为全局变量调用,成功了~我去了!不应该啊,这是因为啥??

牌型种数

家住魔仙堡 提交于 2020-07-28 11:00:24
小明被劫持到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/4339481/blog/4422612

SPOJ MAXOR (分块 || 可持久化字典树 || 异或)(好题)

两盒软妹~` 提交于 2020-07-28 09:51:38
You are given a sequence A[1], A[2], ..., A[N]. (0 ≤ A[i] < 2 31 , 1 ≤ N ≤ 12000). A query is defined as follows: Query(x,y) = Max { a[i] xor a[i+1] xor ... xor a[j] ; l ≤ i ≤ j ≤ r }. l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ). r = max ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ). lastans[1] = 0 , lastans[i] = Query[i-1]. Given M queries, your program must output the results of these queries. (0 ≤ M ≤ 6000). IMPORTANT : PROBLEM ENHANCED. ( I'M SO SORRY.. ) Input The first line of the input file contains 2 numbers : N M. In the second line, N numbers follow. M lines follow,

并查集与带权并查集---由浅入深

廉价感情. 提交于 2020-07-28 09:50:29
并查集 基本概念 ​ 并查集,在一些有N个元素的 集合 应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。 ​ 并查集是一种树型的数据结构,用于处理一些不相交 集合 (Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 实现原理 ​ 通过更新维护父亲节点使得,合并后的集合最终拥有同一个点根节点,拥有相同根节点即为同类。 Search 查找自己的根节点;(红圈标记为根节点)    Merge 合并两个节点在一个集合;(假设寻找合并节点5和2)    压缩路径;压缩路径可以使得在多次查询时,查询时间得到优化,具体过程是优化其结构,使得查询点的父亲节点为根节点。(上图压缩路径后得到)    代码实现 1 void init(){ // 初始化自己祖先就是自己 2 for ( int i = 1 ; i<= n; i++ ){ 3 pre[i] = i; 4 } 5 } 6 7 int Search( int x){ // 递归寻找自己的祖先 8 return x == pre[x] ? x : pre[x] = Search(pre[x]); 9 } 10 11 void Merge( int x, int y){ // 合并两个节点 12 int fx = Search