随笔分类 -  LETTers比赛

1
摘要:LETTers比赛第十二场解题报告提交人:周杰第一题:典型的misere nim问题。可以通过拓展的nim游戏的证明来求解。单一nim游戏的证明是通过证明N和P态,然后证明必然的路径和终止状态的归属来证明的。这道题也是一样。具体证明可以参考09年国家集训队贾志豪的论文,或者参考我放在群共享里的game theory教材,或者下面这篇证明:http://blog.csdn.net/tdreamge/article/details/7227295。放上我的核心代码:int t;int num1, num2;int n;int data;int ans;int... 阅读全文
posted @ 2012-05-16 17:26 LETTers 阅读(212) 评论(0) 推荐(0)
摘要:第1题解题报告提交人:蔡驰宇提交日期:2012.05.09题目描述很水的一道题,实际上就是一个三角形求重心的问题,套用公式就好了。程序#include<iostream>#include<cmath>using namespace std;const int inf=1<<29;const int M=50200;const double eps=1e-8;struct point{ double x,y;}po[5],p,g;int n;int main(){ int T,i; while(scanf("%d",&T)==1) 阅读全文
posted @ 2012-05-09 21:20 LETTers 阅读(180) 评论(0) 推荐(0)
摘要:开始用深搜,写了大半突然发现不行,大牛指导下改用广搜,开始是单纯的广搜,只是对方向处理的时候有点特殊,即break出的小水滴若没遇到阻碍则一直沿相同方向前进,否则被吸收,如果吸收后的大水滴过了稳定的限制则重新break成四个方向的小水滴。WA搜到一大牛博客,进一步发现如果在q次点击结束前已经到达了全为0的状态,则剩下的水滴不用再处理,输出YES,加上后依然WA然后放下,等自己灵感乍现吧灵感乍现如果格局一开始就全为0,那就后面的点击都不用处理了,直接YES,WA要断网的时候又仔细看了遍题目,终于发现了关键点:When multiple waterdrops arrive at (a square 阅读全文
posted @ 2012-05-08 18:51 LETTers 阅读(171) 评论(0) 推荐(0)
摘要:这题感觉 lcp 还是必须的,时限卡得比较紧,所以就只能扩展 kmp 了。但是比起后缀系列的 lcp ,扩展 kmp 能求的 lcp 还是有一些限制的。本题中,对于一些情况,就不得不用循环复制的方法,将问题化解。大致可以分为 3 种情况,具体就看图吧。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAXN 100000#define max(x,y) x>y?x:yvoid get_self_lcp(char *t, int lt, int 阅读全文
posted @ 2012-05-08 18:48 LETTers 阅读(163) 评论(0) 推荐(0)
摘要:矩阵连乘,直接暴力之。因为只要求保留两位小数,函数一定是收敛的。#include<iostream>using namespace std;double temp[105][105];double jiecheng(int n){//不想查阶乘的英文了。if(n==0)return 1;double ans=1;for(int i=1;i<=n;i++)ans*=i;return ans;}void Matrix_Muti(double mt[105][105],int n){int i,j,l,count;double m,save[105][105],di,ans[105 阅读全文
posted @ 2012-05-08 18:43 LETTers 阅读(190) 评论(0) 推荐(0)
摘要:【题目意思】给你很多个点,这些点满足a set of points (xi, yi) that satisfy xi < xj and yi > yj for all i < j.让你用一棵树把所有点连在一齐,树只能往上跟右生长,求树的总长度最小 【解题思路】类似石子合并,加上四边形优化就行了 定义状态 dp[i,j]表示点i到点j合并在一起的最小花费(树枝的长度), 状态转移方程:dp[i,j]= min(dp[i,k]+dp[k+1,j]+cost(i,j) ) i<k<j cost(i,j)=py[k]-py[j]+px[k+1]-px[i]; 当j固定时, 阅读全文
posted @ 2012-05-08 18:40 LETTers 阅读(154) 评论(0) 推荐(0)
摘要:这个题等价于求将长度为2k的序列A = {1,2,...,2k}划分为两个长度为k的递增子序列B = {b1,b2,...,bk} 和 C = {c1,c2,...,ck},对任意i属于1到k满足bi < ci 的划分方式总数。 一个满足条件的划分等价于: 有两个栈,一个叫A,一个叫B,元素从小到大依次入栈,但是必须满足B栈的长度在任意时刻不小于A栈的长度。比如,如果有六个数1到6,则下图是一种入栈方式: 很明显,这是一个Catalan数了。View Code 1 #include <stdio.h> 2 const int MAX = 41; 3 long long num 阅读全文
posted @ 2012-04-27 22:23 LETTers 阅读(123) 评论(0) 推荐(0)
摘要:这道题和上次周杰出的相似三角形题,是我们校队在2011区预赛中做对的唯一的两道题,最终校队是以罚时的微弱劣势丧失银牌~解题思路很多种,这里提供一种自己的思路首先题目求解最小生成树(MST);这里用Prim算法并把最小生成树边的集合存起来;然后依次去掉每条边,考虑这个n-2边的图,两个for循环依次枚举这两个连通图上的点;得出最优值。View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 const int maxn=1000+10; 5 typedef struct 6 阅读全文
posted @ 2012-04-25 21:30 LETTers 阅读(209) 评论(0) 推荐(0)
摘要:这是其它国家区预赛的题目,大家可以看出来区域现场赛最简单题的难度。解题的思路很容易想到,四则运算处理可能比较麻烦~但是经过细心调试应该问题不大;还有就是排列的生成可以自己写,但是这里提倡用next_permutation()函数!还有一点是要注意结束的判断。 以下是参考解题程序:View Code 1 #include<stdio.h> 2 #include<stack> 3 #include<algorithm> 4 #include<ctype.h> 5 #include<string.h> 6 using namespace s 阅读全文
posted @ 2012-04-25 21:27 LETTers 阅读(189) 评论(0) 推荐(0)
摘要:状态为DP[x][y][z]=DP[x-1][y][z-1]+DP[x][y-1][z]+DP[x][y][z-1];注意一点数值为长整型!#include<stdio.h>#include<string.h>const int maxn=20;__int64 f[maxn][maxn][maxn];int vis[maxn][maxn][maxn];__int64 Solve(int a,int b,int c){ if(a<0||b<0||c<0)return 0; if(vis[a][b][c])return f[a][b][c]; vis[a] 阅读全文
posted @ 2012-04-25 21:25 LETTers 阅读(134) 评论(0) 推荐(0)
摘要:1004UnitFractionPartition(POJ1980)解题思路:DFS+剪枝。这题的剪枝条件还是比较严格的,很容易超时,我想到的需要剪枝的情况有以下几点:①前几项的和超过了最大值。②前几项的积超过了最大值。③深度超出。④提前“预测”剪枝:即如果剩余的项数乘以当前最小分数要大于剩余的值,则不应该往下搜索。第④点是至关重要的,没有考虑到的话一般会超时。还有可以优化的地方就是避免用实数类型,一是精度难以把握,而是实数运算相对整数运算要慢。代码如下:#include <cstdlib>#include <iostream>using namespace std;i 阅读全文
posted @ 2012-04-24 22:41 LETTers 阅读(322) 评论(0) 推荐(0)
摘要:1003TheEmbarrassedCryptographer(POJ2635)解题思路:高精度求模+同余模定理+素数打表。注意以下几点:①素数表不能只打到10^6,必须保证素数表中的最后一个大于10^6。②读入大数后用千进制(或万进制,十万进制……),用十进制可能会超时。代码如下:#include <cstdlib>#include <iostream>using namespace std;char key[105];int keyLen = 0;int num[105];int numLen = 0;int primes[1000005];int cnt = 0; 阅读全文
posted @ 2012-04-24 22:23 LETTers 阅读(163) 评论(0) 推荐(0)
摘要:1002Babelfish(POJ2503)解题思路:字符串的哈希,找一个比较好的hash函数就可以了,冲突时用链表的形式组织。用STL中的map等容器也可以过,不过性能差点。代码如下:#include <cstdlib>#include <iostream>using namespace std;#define N 1000005#define HASH 3999971struct node{ char a[11]; char b[11]; int next;};struct node words[N];int head[HASH];int t = 0;int inl 阅读全文
posted @ 2012-04-24 22:10 LETTers 阅读(179) 评论(0) 推荐(0)
摘要:1001BasicallySpeaking(POJ1546)基本思路:基本的进制转换,先转化成十进制再转化成目标进制即可。代码如下: 1 #include <cstdlib> 2 #include <iostream> 3 #include <cmath> 4 5 using namespace std; 6 7 int a = 0; 8 int b = 0; 9 char aNum[10];10 char bNum[10];11 12 void solve()13 {14 int i = 7;15 int j = 0;16 int ans = 0;17 i 阅读全文
posted @ 2012-04-24 22:03 LETTers 阅读(179) 评论(0) 推荐(0)
摘要:N!log10(10000!) = ∑log10(i)( 1<= i <= 10000) = 35659.5,所以10000!≈10^35659.5,这个数很大,所以用模拟手算乘法的方法计算。#include<iostream>#include<math.h>using namespace std;#define MAXN 40000int a[MAXN], bit;void mul(int*m, int a) // m = m * a{ int c, i; bit += int(log10(double(a))) + 2; for(c=0,i=0; i&l 阅读全文
posted @ 2012-04-18 21:33 LETTers 阅读(148) 评论(0) 推荐(0)
摘要:报告人:侯建鹏报告日期:2012/4/161004 Max Sum Plus Plus解题思路:动态规划的思想。1.基本思路:首先,定义数组p[n],a[m][n].p[n]用来存储n个整数组成的序列.a[i][j]用来表示由前j项得到的含i个字段的最大值,且最后一个字段以p[j]项结尾。仔细想想,我们可以知道: a[i][j]=max(a[i][j-1]+p[j],a(i-1,t)+p[j]) 其中i-1<=t<=j-1.所求的最后结果为 max( a[m][j] ) 其中1<=j<=n.但是,我们会发现,当n非常大时,这个算法的时间复杂度和空间复杂度是非常高的,时间 阅读全文
posted @ 2012-04-16 21:43 LETTers 阅读(193) 评论(0) 推荐(0)
摘要:报告人:侯建鹏报告日期:2012/4/161003 大明A+B解题思路:模拟我的方法很简单,就是不停的模拟、模拟、再模拟。首先,把每个数都分成两部分,整数部分和小数部分,即a_h_count、a_l_count、b_h_count、b_l_count。相信只要细心一些都可以做出来的。然后,把模拟人工计算过程,先加小数位,加完之后,产生的对整数位的进位再和两个数的整数部分相加,最后把零去掉,输出就可以了。关键是:一定要细心!!!详见代码。#include<stdio.h>#include<string.h>#define N 400+10char a[N],b[N];in 阅读全文
posted @ 2012-04-16 21:41 LETTers 阅读(367) 评论(0) 推荐(0)
摘要:提交人:侯建鹏提交日期:2012/4/161002 Ignatius and the Princess III解题思路(一):动态规划先设置int p[N][N];Dp 方程为:p[i][j]=p[i][j-1]+p[i-j][j]。其中,p[i][j]表示将i分解成小于等于j个项的方法的种数。很明显,p[i][j]等于将i分解成小于等于j-1个项的种数(即p[i][j-1]),再加上,将它分解成j个项的方法的种数(即p[i-j][j]).下面重点来说一下为什么将i分解成j个项的方法的种数为p[i-j][j]。举例:将4分解成2个项的方法有两种,3、1和2、2.将这两组数字每个数字都减一,你会 阅读全文
posted @ 2012-04-16 21:38 LETTers 阅读(344) 评论(0) 推荐(0)
摘要:提交人:侯建鹏提交日期:2012/4/161001 Least Common Multiple 这道题求解的是几个数的最小公倍数,我的想法是先求前两个数的最小公倍数,再求的得到的这个数和第三个数的最小公倍数,以此类推。求解两个数a和b的最小公倍数d的方法:1、 用辗转相除法求出这两个数的最大公约数,记为c。2、 则最小公倍数d=(a/c)*b。特别注意的问题:为什么d=(a/c)*b而不是d=(a*b)/c? 因为a和b都是32bit的数字,如果先执行a*b很可能会超出32bit的存储范围而发生错误,所以先除再乘。(当然,如果你用的是__int64,可以忽略这个问题)#include<s 阅读全文
posted @ 2012-04-16 21:34 LETTers 阅读(171) 评论(0) 推荐(0)
摘要:LETTers比赛第二场解题报告:提交人:周杰第一题:典型的威佐夫博奕,具体解法请大家参考程序中的吧,有现成的公式,有兴趣的同学可以试试去查下证明过程。AC程序之一:#include <stdio.h>#include <math.h>int a, b, temp, k;int result;int main (int argc, char* argv[]) { while (scanf("%d %d", &a, &b) != -1) { if (a > b) { temp = a; a = b; b = temp; } k = 阅读全文
posted @ 2012-04-15 16:37 LETTers 阅读(247) 评论(0) 推荐(0)

1