均分纸牌 题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。   移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。   现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。   例如 N=4,4 堆纸牌数分别为:   ① 9 ② 8 ③ 17 ④ 6   移动3次可达到目的:   从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。 输入描述 Input Description 第一行N(N 堆纸牌,1 <= N <= 100) 第二行A1 A2 … An (N 堆纸牌,每堆纸 继续阅读 >>


王良 18/03/05 16:55:40
A. Winner The winner of the card game popular in Berland “Berlogging” is determined according to the following rules. If at the end of the game there is only one player with the maximum number of points, he is the winner. The situation becomes more difficult if the number of such players is more than one. During each round a player gains or loses a particular number of points. In the course of the game the number of points is registered in the line “n 继续阅读 >>


王良 18/03/01 17:25:13
Ananagrams (map的使用) Most crossword puzzle fans are used to anagrams–groups of words with the same letters in different orders–for example OPTS, SPOT, STOP, POTS and POST. Some words however do not have this attribute, no matter how you rearrange their letters, you cannot form another word. Such words are called ananagrams, an example is QUIZ. Obviously such definitions depend on the domain within which we are working; you might think that ATHENE is 继续阅读 >>


王良 18/02/11 18:16:30
最佳加法表达式 题意描述 输入n个数字,给m个加号,将所有加号任意放在n个数字中某位置,要求最终得到的加法表达式的结果最小。 INPUT 4 2 1 2 3 4 OUTPUT 19 分析 本题使用动态规划,将原问题分解为:求前i个数字中放入m-1个加号的最佳加法表达式的值,再加上最后剩余数字的值。即dp[n][m] = Min{ dp[i][m-1] + Num[i+1][n] }。 问题初始值为不放加号的时候,即dp[i][0] = 0。 code #include <iostream> #include <algorithm> #include <cstring> using namespace std; /* * dp[i][j] 表示前i个数字放入j个加号的最小加法表达式值 * num[i][j] 表示第i个数字到第j个数字([i, j])组成的新数 * a[i] 存储输入输入的数字 **/ int dp[1000] 继续阅读 >>


王良 18/02/07 17:50:48
水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8752 Accepted Submission(s): 3482 Problem Description 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想 要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了. Input 第一行正整数N(0<N<=10)表示有N组测试数据. 每组测试数据的第一行是一个整数M(0<M<=100),表示工有M次成功的交易.其后有M行 数据,每行表示一次交易,由水果名称(小写字母组成,长度不超过80),水果产地(小写字 母组成,长度不超过80)和交易的水果数目(正整数,不超过100)组成. Output 继续阅读 >>


王良 18/02/06 21:54:55
何为最长公共子序列?百度百科定义如下:一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。 首先,我们来介绍一下子串与子序列 的区别:子串是一个字符串中的连续字符的集合;子序列是一个字符串中任意字符的集合,不一定要连续。 然后,如何来求得最长公共子序列呢?最直接的一种方法就是暴力求解,通过比较两个字符串的所有子序列,得到公共子序列,最终得到长度最长的长度。然而这种方法的时间复杂度达到了O(2^n),可见这种方法耗时太长。 所以,我们需要一种更加高效的算法来解决,那就是动态规划。我们可以将求最长公共子序列分解为若干个子问题,即求str1的前i个字符与str2的前j个字符的最长公共子序列,我们假设用maxLen( i, j )来表示。 那maxLen(i, j)怎么求呢?此时,可以分为两种情况:str1[ i - 1 ] == str2[ j - 1 ]与str1[ i - 1 ] != str2[ j - 1 ](str1的第 继续阅读 >>


王良 18/02/03 22:58:15
EPOLLONESHOT 事件 EPOLLONESHOT 事件 使用EPOLLONESHOT的原因及优点 recv返回值 及 与errno的配合使用 示例程序 1. 使用EPOLLONESHOT的原因及优点 即使使用ET模式,一个socket上的某个事件还是可能被触发多次。比如:一个线程在读取完某个socket上的数据后开始处理这些数据,而在数据的处理过程中该socket上又有新数据可读(EPOLLIN再次被触发),此时另外一个线程被唤醒用来读取这些新的数据。于是就出现了两个线程同时操作一个socket的局面。而我们希望一个socket连接在任一时刻都只能被一个线程处理,这就可以通过EPOLLONESHOT事件实现。 对于注册了EPOLLONESHOT事件的文件描述符,操作系统最多触发其上注册的一个事件,且只触发一次,除非我们使用epoll_ctl函数重置该文件描述符上注册的EPOLLONESHOT事件。这样,在一个线程使用socket时,其他线程无法操作so 继续阅读 >>


王良 18/02/03 19:23:31
epoll 系统调用 1. 内核事件表 epoll使用一系列函数来完成任务,把用户关心的文件描述符中的事件放到内核里的一个事件表中,因此不用像select、poll那样每次调用都要重复传入文件描述符集或事件表。epoll需要一个文件描述符来唯一标识该事件表,该文件描述符使用epoll_create函数创建: #include <sys/epoll.h> int epoll_create( int size ); size 标记事件表大小。该函数返回的文件描述符将用作其他所有epoll系统调用的第一个参数,以指定要访问的内核事件表。 epoll_ctl函数用于操作epoll的内核事件表: #include <sys/epoll.h> int epoll_ctl( int epfd, int op, int fd, struct epoll_event * event ) fd参数是要操作的文件描述符,op参数指定操作类型( 继续阅读 >>


王良 18/02/02 20:09:44
题意: 有n只兔子在不同的位置,任意一只兔子可以跳到其余任两只兔子(必须保证它们中间有空位)中间,问最多可移动多少次? 思路: 可看作从任一侧的兔子向中间插空,因此可以将所有兔子中间的空位数相加,再减去两侧较小的数字(最左侧两只兔子间距离与最右侧两只兔子间距离的较小的值)。 AC代码: #include<iostream> #include<vector> #include<cstring> using namespace std; int main() { int t, n, sum, addr[500]; int front, rear; cin >> t; while(t--) { sum = 0; memset(addr, 0, sizeof(addr)); cin >> n >> addr[0]; 继续阅读 >>


王良 17/12/21 22:09:16
1. 引用变量 引用是已定义变量的别名,若使用int & x = a;,即将x作为a的引用,其中的&不是地址运算符,而是类型标识符的一部分。事实上,x与a指向的是同一块内存空间,对x进行操作即对a进行操作。必须在声明引用变量时进行初始化。 /* ** 该程序试图通过指针改变引用变量x的指向 ** 体现了引用与指针的区别 */ int a = 100; int *p = &a; //指针p指向a int & x = *p; //x作为*p的引用,即对a的引用 int b = 50; p = &b; //将指针p指向b,试图修改x为b的引用(invalid) cout << "x = " << x << endl; 该程序最终输出为x = 100。 可见,一旦将x初始化为*p,也就是使x指向a,再接下来即使将指针p指向b,也不能改 继续阅读 >>


王良 17/12/04 22:33:36