摘要: 题目不难,还是利用向量叉积,看图接下来,只需按逆时针一次判断一边和一点的关系,若叉积>0,则表示存在大于180的内角,即为凹多边形#include<iostream>#include<math.h>using namespace std;struct node{ int x,y;}p[100];int seg(node p1,node p2,node p3){ int d=(p3.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p3.y-p1.y); if(d<0) return 1; else return 0;}int main(){ 阅读全文
posted @ 2011-07-29 11:51 枕边梦 阅读(1639) 评论(0) 推荐(1) 编辑
摘要: 要猜到最大的数字m,也就是说,在1到m间的每一个数,你都能在n次内把它猜出来!http://hi.baidu.com/xiao%5Fyu%5Ffeng/blog/item/11ab800ed1a7a3236159f334.html所以说在最坏的情况下,在1到m间,你最多只要猜log2(m)+1(取整)次,所以易知==>m=2^n-1.即猜n次,你能猜到的最大的数为2^n-1.我们也可认为,在数1到2^n-1间,我们都可以在n次内猜出来,如果大于这个数,n次内我们就哟可能猜不来了。例如1--7间,我们至少要猜3次猜可以#include<stdio.h>int main(){ i 阅读全文
posted @ 2011-07-29 11:05 枕边梦 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 纯数学题,找规律Orz看了网上的解题报告,稍微有点懂了首先就是找出m和n各自所在的层数,并求出俩层的差cc,这个好办接下来求出m(比较小的那个)所在三角往下的辐射边界,简单的说,就是m所在三角往左下角和右下角的延伸后,在n所在层的边界再来,就是判断n是在边界内还是边界外,若是边界外,则是n与边界距离+2*cc;若在边界内,则需判断n与m所在三角形是否同为正或同为倒,若同正同倒,则直接等于2*cc,若不同,则需判断m是正还是倒,若m为正,则为2*cc-1;若m为倒,则为2*cc+1;结合图片比较好理解http://acm.hdu.edu.cn/showproblem.php?pid=1030看代 阅读全文
posted @ 2011-07-28 22:30 枕边梦 阅读(880) 评论(0) 推荐(0) 编辑
摘要: 额,直接用公式吧还有,科学计数法没办法直接按要求输出,得直接求出指数#include <stdio.h>int main (){int n,c;double sum;while (scanf("%d",&n)!=EOF){ if (n==0)break; sum=1.0/6*n*(n+2)*(n+1); c=0; while (sum>=10) { c++; sum/=10; } printf ("%.02lfE%d\n",sum,c);}return 0;} 阅读全文
posted @ 2011-07-28 16:51 枕边梦 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 田忌赛马,经典的贪心,不过很难想到呀,每次都用最快跟最快的,最慢的跟最慢的进行比较、判断1)若田最快的比王最快的慢,则用最慢的跟王最快的比,输掉一局;反之,则赢了当然是最划算的选择了2)若田最慢的比王最慢的还慢,则用最慢的跟王最快的比,输掉一局;反之,同上。这俩步是贪心所在;还有就是注意想等到情况……看代码吧#include<stdio.h>#include<stdlib.h>int cmp(const void *a,const void *b){ return *(int*)a-*(int*)b;}int main(){ int s[1001],t[1001],n; 阅读全文
posted @ 2011-07-27 22:14 枕边梦 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 很明显,要计算出搬桌子的最短时间,就是算出最多重叠的时间段有多少,计算重叠的区间的最多的个数,相当于计算数轴上某一个点被堆叠的最多的次数,所以接下来就好理解了看代码……#include <iostream> using namespace std; int main() { int t,i,j,N,P[200]; int s,d,temp,k,min; cin>>t; for(i=0;i<t;i++) { for(j=0;j<200;j++) P[j]=0; cin>>N; for(j=0;j<N;j++) { cin>>s&g 阅读全文
posted @ 2011-07-27 20:05 枕边梦 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 黑书中的经典题:枚举+贪心把每钓5分钟鱼称为钓一次鱼。首先枚举John需要走过的池塘的数目X,即从池塘1走到池塘X。减去路上花去的时间T=sum(Ti) i=1...X-1,这样我们可以认为John能从一个池塘"瞬间转移"到另一个池塘,即在任意一个时刻都可以在池塘1到池塘X中任选一个钓一次鱼(很重要)。现在采用贪心策略,每次选择鱼最多的池塘钓一次鱼。对于每个池塘来说,由于在任何时候鱼的数目只和John在该池塘里钓鱼的次数有关,和钓鱼的总次数无关,所以这个策略是最优的。假设一共允许钓k次鱼,那么每次在N个池塘中选择鱼最多的一个钓。总的时间复杂度为O(kn^2)。(黑书中的解释 阅读全文
posted @ 2011-07-26 18:12 枕边梦 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 这字符串处理够麻烦的,不过居然都可以用库函数解决,倘若是手动对字符串进行预处理,真是难以想象啊不过,也不可否认,内存开了超大的,时间也差点超了…… #include<iostream> #include<string> #include<map> using namespace std; map<string, int> s; string tele[1000000]; int main() { s.clear(); int n, k = 0; cin >> n; for (int i = 1; i <= n; i++) { c 阅读全文
posted @ 2011-07-25 22:19 枕边梦 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 只要最后统计出有多少个集合就好了我用并查集还有set做的,好像用set慢了一点#include<stdio.h>#include<set>using namespace std;int f[1010];int find(int x){ if(x==f[x]) return f[x]; f[x]=find(f[x]); return f[x];}void Union(int x,int y){ int a=find(x); int b=find(y); if(a==b) return ; f[a]=b; return ;}int main(){ int n,m,i; in 阅读全文
posted @ 2011-05-20 22:25 枕边梦 阅读(169) 评论(1) 推荐(0) 编辑
摘要: hdu2222 key word search模板题来的,求所有单词在文本的出现的个数简单说说我对AC自动机的理解吧学习AC自动机的之前,首先要了解的就是kmpkmp处理的是单个模式串与文本的匹配,其中kmp的关键就在于求next数组,而且next数组记录的就是,如果当前位置匹配失败的,模式串应该应该移动到哪一个位置重新与文本匹配,这样就避免了每次都从头开始匹配,而且文本串的指针是不需要回溯的对于AC自动机也是类似,充分利用已匹配的信息,避免了从头开始匹配。AC自动机处理的是多个模式串与一个文本,最糟糕的情况就是我们用每一个模式串跟文本进行匹配。但是,当前一个模式串匹配失败时,是否有什么信息可 阅读全文
posted @ 2011-05-20 10:44 枕边梦 阅读(327) 评论(0) 推荐(0) 编辑