![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM
h549570564
这个作者很懒,什么都没留下…
展开
-
XDU 1010 素数环
#include#include#includevoid dp(int x,int y);int isprime(int m);int n,a[25],b[25];int main(){ int i,j=0; b[1]=1;//用b数组保存第i个位置的数字为b[i] while(scanf("%d",&n)!=EOF) {原创 2013-07-31 20:46:08 · 382 阅读 · 0 评论 -
POJ 3080 Blue Jeans(KMP)
题意:有多个基因碱基序列(只由AGCT组成),在这些序列中找出一个最长的公共子串,如果长度相等,优先输出字典序较小的串。思路:由于数据较小,所以直接枚举第一个串中的子串,然后依次对之后的串每次作一次KMP判断是否匹配即可。注意:当串的长度相同时,要优先输出字典序较小的串。(尼玛最开始没看到好蛋疼)# include# include# includeusing namespace原创 2013-08-12 13:07:28 · 472 阅读 · 0 评论 -
POJ 1160 Post Office(DP)
题意:有m个村庄排成一条直线,现在需要在这些村庄里建n个邮局,使得各个村庄到最近邮局的总距离和最小。 思路:用dp[i][j]记录把前i个邮局建到前j个村庄中的最优解。 用cost[i][j]记录所有在i到j村庄中,建1个邮局的最小代价。 让前i个邮局覆盖前j个村庄,第i+1个邮局覆盖第j+1至j+k个村庄(j+k dp[i+1][原创 2013-08-12 23:02:17 · 994 阅读 · 0 评论 -
HDU 4287
题意:从1到9,每个数字分别代表多个不同的字母。 给出N个数字,M个字符串,将N个数字转化为字母之后求出其在M个字符串中出现了多少次。思路:该题与USACO上第一章有个题类似,如果将数字转化为字母太复杂不好处理。反向思考,将M个字符串转化为对应的数字,然后每次只需要与M个数字比较即可。#include#includeint f[1000001];int map原创 2013-09-07 19:09:04 · 507 阅读 · 0 评论 -
K尾相等数(NYOJ212)
题目描述:从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M和K^N均大于或等于1000,且他们末尾三位数相等,则称M和N是一对“K尾相等数”。编写一程序,输出M+N值最小的K尾相等数。测试输入数据:2 测试输出数据:120 思路: 最开始想错了,蛋疼了很久。仔细思考后,我们可以注意到,任何数对1000求模只有1000种可原创 2013-09-23 23:29:03 · 1373 阅读 · 0 评论 -
POJ 1207(3n+1数链问题)
题意:有一个算法,对数字进行转化,定义为: (1).输入一个正整数n; (2).输出n; (3).如果n=1,算法结束; (4).如果n是奇数,将n转化为3n+1; (5).如果n是偶数,将n转化为n/2; (6).跳转到第2步。原创 2013-09-23 23:56:43 · 652 阅读 · 0 评论 -
XDU 1008 - 数星星
思路:若比较三点是否在同一条直线上直接不好比,将其化为斜率,若斜率相等则在同一直线上。 从前往后枚举每一个点作为起点,然后每次计算出它之后的点到它的斜率,对斜率进行排序,找出斜率相等的最多点数即为所求。#include#include#include#includeusing namespace std;#define eps 1e-10i原创 2013-10-09 13:48:49 · 769 阅读 · 0 评论 -
POJ 1042 Gone fishing(枚举+贪心)
题意:在一条水平路边,有n(2思路:枚举+贪心 如果直接想的话,不容易想到很好的方法。假设有一种钓鱼方法可以使吊到的鱼数最多,那么中途走路的时间一定是到最远的那个湖的时间。因此,我们只要每次减去到最远的那个湖所走的时间后,我们就可以在里面“瞬移”钓鱼了。因此,枚举第1到第n个湖,提前减去到第n个湖所用的时间,然后每5分钟选取一个鱼量最大的湖钓鱼直到没有鱼或者时间用完为止。注意:如果原创 2013-10-23 14:54:44 · 712 阅读 · 0 评论 -
POJ 2406 Power Strings(KMP的应用)
问题描述:给定一个字符串L,已知这个字符串是由某个字符串S重复R次而得到的, 求R的最大值。方法一:直接暴力枚举子串长度,从1到len/2一一判断,如果合法即进行输出。#include#includeint main(){ char s[1000000+100]; int i,j,k,len,ok; while(scanf("%s",s)) {原创 2013-08-08 16:53:43 · 450 阅读 · 0 评论 -
POJ 1363 Rails(模拟栈)
原地址http://blog.csdn.net/kk303/article/details/7203339#include#includeusing namespace std;int n,a[1005],i;bool ok(){ int mystack[1005],num=0,i,k=1; for (i=1;i<=n;i++) {转载 2013-10-28 19:47:36 · 405 阅读 · 0 评论 -
XDU 1003 最喜欢的数字
尼玛坑爹的题总超时,现在还是不会,先赋上别人AC的代码吧。原博客地址:http://blog.csdn.net/tankpt/article/details/8797343#include#define N 100001int num[N];int mark[N];int prim[N];int pnum=0;int main(){ int i,j;转载 2013-07-31 20:52:08 · 598 阅读 · 0 评论 -
POJ 2234 Matches Game(直接的NIM)
//简单直接的博弈论问题,两个人分别取n堆石子,谁取到最后一颗谁赢,SG(x)=x,直接异或即可#include#define maxn 20+10int m;long number[maxn];int find_sg(int x)//SG函数{ return x;}int main(){ while(scanf("%d",&m)!=原创 2013-07-31 20:57:12 · 448 阅读 · 0 评论 -
POJ 1269 Intersecting Lines(判断两条直线关系)
题意:给你四个点确定两条直线,判断两条直线的位置关系。思路:直接判断斜率存不存在。 a.其中一条斜率存在,一条不存在——两者一定相交 b.两条斜率都不存在——判断x坐标是否相等,如果相等就重合,不相等就平行 c.两条斜率都存在——直接求出交点即可#include#include#include#de原创 2013-08-12 01:19:32 · 598 阅读 · 0 评论 -
POJ 1088 滑雪(记忆化搜索)
题意:给出一个图,求出最长的下降序列的长度。因为在搜索的过程中,我们可以利用到之前搜到的结果,因此我们需要储存之前的结果,当我们需要使用之前结果时直接调用,不用再次计算。记忆化搜索的想法就是这样,其实实现也是相当简单的,只需在之前搜索的代码上加一个判断语句就够了。#includeint r,c,height[120][120],dp[120][120];int dx[10]={-1,1,0,0原创 2013-08-12 01:10:08 · 448 阅读 · 0 评论 -
HDU 1003 Max Sum(连续子段和)
题意:给定一串数字,让你求出其中一串连续的数字使其和最大。状态转移方程:sum[i+1]=sum[i]>0? sum[i] + num[i + 1] : num[i + 1]。#include#includeint main(){ int t,n,i,j,k,T,start,end,ans; int number[100000+10],dp[100000+10];原创 2013-08-05 10:50:12 · 461 阅读 · 0 评论 -
XDU 1049 斐波那契数(大数取模)
题意:给定一个数i,判断第i个斐波那契数是偶数还是奇数。思路:推理可得斐波那契数列为偶,奇,奇,偶,奇,奇...因此,直接对i取模并判断即可。(主要是大数取模)#include#include//根据推理,斐波那契数列1个偶数紧跟2个奇数,因此直接取模即可,注意数据很大。int mod(char str[],int num)//大数取模操作{ int number[1原创 2013-07-31 20:53:57 · 690 阅读 · 0 评论 -
POJ 2484 A Funny Game(找规律)
一道简单的博弈题题意:有n个硬币围成一圈,两人轮流拿取,每次可以取1个或者相邻的2个,不能取的人输思路:n=1/2时很明显先手赢 当n为偶数且n>2时先手取后,后手只需要取和它相对的即可,一定会保证后手取最后一个 当n为奇数且n>2时当先手取后,若先手取1个,后手去掉与之相对的2个即转化为n为偶数时的情形;若先手取2个,后手去掉与之相对中间那一个也转化为n为偶数原创 2013-07-31 20:56:41 · 545 阅读 · 0 评论 -
POJ 3006 Dirichlet's Theorem on Arithmetic Progressions(素数筛的简单应用)
题目大意:给一个等差数列,让你在这个数列中找出第k个素数。由于数据很小,并有多组输入,所以直接素数筛打表然后即可,暴力也可以过。#include#include#define maxn 1000000int is_prime[maxn]={0};int main(){ int i,j,k,a,d,n,ans; is_prime[1]=1; is原创 2013-07-31 20:59:39 · 510 阅读 · 0 评论 -
POJ 1861 Network(Kruskal)
题意:有N台机器,M条已知的边和权值。求最小生成树,并输出最大边和所有的边。水题,直接复制Kruskal模板即可。//依次添加最小的边,使图不能形成环即可#include#include#define num 100000struct book//定义边的结构体{ int x,y,w;//左端点,右端点,权值}edge[num];i原创 2013-07-31 21:01:58 · 487 阅读 · 0 评论 -
POJ 1251 Jungle Roads(最小生成树裸prim)
有多个岛屿,部分岛屿之间有路连接,但是维护一条道路要花费一定的费用。现在让你在保证所有岛联通的情况下,使维护费用最小并输出。思路:直接的prim。#includeint T,i,j,k,num,wei;int record[30000],distance[30000];//记录该点是否被访问int weight[3000][3000];int findmin();//寻原创 2013-07-31 21:03:39 · 468 阅读 · 0 评论 -
POJ 1258 Agri-Net(裸prim)
有多个点,让你找出将所有点联通的最短路径,直接裸prim,注意是多组数据。#include#define maxn 200000int N,i,j,k,sum;int weight[110][110],distance[110];//distance数组表示点到生成树的距离int record[110];//记录该点是否被访问int findmin();//每次找离生成树最近的原创 2013-07-31 21:04:18 · 435 阅读 · 0 评论 -
大数除法模板
原理:直接模拟手动除法即可,注意去除前导0.#include#includeint division(char a[1000],int b,int c[1000])//a除以b存入c中,返回商的位数{ int i,k; int j=0;//j表示商的位数 int count=0;//表示余数 int mark=0;//标记去掉前导0 for(i=0;i原创 2013-08-02 13:01:03 · 641 阅读 · 0 评论 -
HDU 2612 Find a way(两次BFS)
题意:有两个人Y和M,给你一个n*m的矩阵。'.'是道路,'Y'是Y的位置,'M'是M的位置,'#'是不能走的路,'@'是KFC。(Y始终在左上角)现在两个人要到城里的一个KFC碰面,问你所需要花费的最短时间是多少。思路:如果直接从Y搜索到M由于必须经过一个KFC显然不可取,因此转化思路。从Y出发搜索到所有KFC的距离,再从M出发搜索到所有KFC的距离,最后枚举找出一个KFC到两个距离原创 2013-08-02 13:13:55 · 544 阅读 · 0 评论 -
POJ 1163 The Triangle
题意:给你一个数字三角形,从上往下走。每次只能直接往左下或者右下走,求从最上面走到最下面数字的最大和。思路:动态规划,设dp[i][j]为从最高点到点(i,j)的最大和,那么dp[i][j]=max(dp[i][j+1],dp[i+1][j])+number[i][j]。即每次都取最大的一个,那么直接从最后一层往上推即可。#includeint max(int x,int y){原创 2013-08-02 15:06:51 · 392 阅读 · 0 评论 -
HDU 1257 最少拦截系统
思路:求最长不下降子序列即可,从后往前一一枚举。设dp[n]=1,从n-1往1枚举,每次取第i+1个到n个比它高且dp值最大的一个,则dp[i]=max+1。最后,找出dp[1->n]最大的即为所求。//求最长不下降序列的长度#includeint main(){ int n,i,j,k,ans,max; int height[100000],dp[100000];原创 2013-08-02 15:23:19 · 357 阅读 · 0 评论 -
POJ 1126 Simply Syntax
题意:有一个字符串让你判断是否是符合语法规范的句子。 语法:1.从p到z的所有字符每一个都是一个规范的句子(注意每一个字母都是一个句子) 2.如果字符串S是一个规范的句子,那么字母N紧跟S也是一个规范的句子(两个合并为一个) 3.如果字符串S和字符串T都是规范的句子,那么字原创 2013-08-04 01:17:27 · 806 阅读 · 0 评论 -
短小精悍的线性时间素数筛法(转)
http://blog.csdn.net/mysword/article/details/5122855输入n,求n以内的所有素数算法用两个数组存储数据:一个是prime[],存储n以内所有的素数,其index为pi,初值为0一个是is_prime[i],表示自然数i(i算法如下:linear_prime_sieves1: set is_prime[] to true转载 2013-07-31 21:00:18 · 468 阅读 · 0 评论 -
HDU 2544 最短路(spfa邻接表)
模板题,用的邻接表写的。#include #include #include #include #include #include #include #define N 150#define inf 999999using namespace std;struct node{ int from,to,value;};queueq;vectorg[N];int原创 2013-08-04 01:08:10 · 587 阅读 · 0 评论 -
HDU 2544 最短路(spfa邻接矩阵)
spfa模板题,用的邻接矩阵存储。#include#include#include#include#include#include#includeusing namespace std;#define maxn 999999int n,m,map[110][110],dist[110],vis[110],a,b,c,ans;queueq;int spfa(int x){原创 2013-08-04 01:09:15 · 742 阅读 · 0 评论 -
HDU 1102 Constructing Roads(prim)
有N个村庄,你需要修建道路使所有的村庄都连通,修建道路要花费一定的权值。有些道路已经修好,不用再修建,让你求出最少所需的权值。直接的prim,将已经修过的路把权值修改为0即可,注意是多组数据。#include#includeint distance[5000];int record[100+5],weight[105][105];int i,j,k,N,Q;int原创 2013-07-31 21:02:56 · 411 阅读 · 0 评论 -
(转)[排序]SORT QSORT
原文地址:http://blog.csdn.net/gokou_ruri/article/details/7387696一.sort函数的用法 排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头转载 2013-07-31 21:04:52 · 455 阅读 · 0 评论 -
大数取模模板
#include#includeint mod(char str[],int num){ int number[100000]; for(int i=0;i<strlen(str);i++) number[i]=str[i]-'0'; int remainder=0; for(int i=0;i<strlen(str);i++) {原创 2013-08-02 13:11:07 · 505 阅读 · 0 评论 -
ZOJ 1354(枚举,模拟)
题意:有一个5*6的矩阵分别代表有这么多灯,有一些灯开着,有一些关着的。现在给出所有灯的初状态,让你输出使所有灯都关闭的开关按法。思路:1.直接枚举所有开关的情况,即枚举2^30种情况,显然这是不能接受的。 2.转化一下思维,假设第一行灯的情况已知,那么我们只需要按第二行的开关就能将第一行灯全部灭掉(按第一行亮着的灯所对应第二行的开关即可)。同理可得,第三行开原创 2013-08-02 13:17:01 · 504 阅读 · 0 评论 -
POJ 1502 MPI Maelstrom(spfa邻接矩阵)
题意:有n个点和m条边,以下三角形矩阵输入,如果两点可以连通则输入其权值,否则输入x表示两点不连通。让你求出从点1将消息全部传到其它点所需要的最短时间。思路:单源最短路径问题,求出从点1到其余点的最短距离,并找出其中最大的一条即为所求。(SPFA+邻接矩阵)#include#include#include#include#include#include#includeusing原创 2013-08-04 01:25:39 · 564 阅读 · 0 评论 -
CodeForces 315B Sereja and Array
题意:给出n个整数,有三种操作。 操作1:输入vi,xi,令第vi个数等于xi,即number[vi]=xi。 操作2:输入yi,令所有的数字都加上yi。即number[1,2,3...n]+=yi。 操作3:输入qi,输出第qi个数。思路:操作1和操作3可以直接进行,而操作2如果每次都对所有数字修改的话复杂度太高因原创 2013-08-05 11:06:15 · 852 阅读 · 0 评论 -
计算几何常用总结
点积:即a*b*cosc,可以用来判断前后问题。设A=(x1,y1),B=(x2,y2),则A*B=x1*x2+y1*y2叉积: 即a*b*sinc,可以用来判断两矢量之间的顺时针和逆时针关系。 设A=(x1,y1),B=(x2,y2),则A*B=x1*y2-x2*y1 若 P * Q > 0,则 P 在原创 2013-08-09 11:04:39 · 389 阅读 · 0 评论 -
POJ 1474 Video Surveillance(判断多边形是否有核)
判断多边形是否有核,利用半平面交即可。直接套模板#include #include const int INF=120000000;struct Point{ int x, y;}pt[150];typedef struct Point Point;bool turn_right[150];int det(Point s1, Point t1, Point s原创 2013-08-12 01:23:12 · 549 阅读 · 0 评论 -
POJ 2007 Scrambled Polygon(极角排序)
题意:给你多个点,让你将其逆时针输出。思路:直接极角排序输出即可。#include#include#include#includeusing namespace std;struct node{ int x,y;};node point[1000];int cross(node p0,node p1,node p2) //计算叉积 p0p1 X p0p2{原创 2013-08-12 16:20:15 · 538 阅读 · 0 评论 -
HDU 1392 Surround the Trees(求凸包周长)
题意:有n棵树,每棵树给出它的坐标,现在以一些树为端点构造围墙将所有树都围起来,求出围墙的总长度。思路:凸包问题,将树看成点求出凸包,然后求出凸包的周长即可。注意:当n=1和n=2时要特判,n=1时为0#include#include#include#includeusing namespace std;const int MAXN=1000;struct point{原创 2013-08-12 23:09:36 · 496 阅读 · 0 评论 -
HDU 4279(数学+找规律)
题意:定义:special number:如果B不能能被A整除,且A和B不是互质的,那么就称A是B的special number。(0 f[x]:数字x所拥有的special数。 real number:当数字x的f[x]是奇数时,则数字x就是real number。 求解:给出x和y原创 2013-09-07 18:59:39 · 517 阅读 · 0 评论