![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM相关
阳光海面
欢迎进行技术讨论我的邮箱 869866435@qq.com
展开
-
抽屉原理的应用(UVa202,多校HUD5726)
个人对于鸽笼原理(抽屉原理)的理解,抽屉原理对于在写程序中的二重循环的优化还是很有用的,比如2016多校第三次训练的1011(HDU 5726) ,UVa202题中的循环小数,都是比较典型的(抽屉原理主要还是在有范围的或者有隐形范围题中)对于多校1011题,在抽屉原理的应用是,在当输入的组数大于输入的限定范围m的时候必然会存在使其有至少两个点的差为相等的,原创 2016-07-27 16:14:11 · 315 阅读 · 0 评论 -
UVa复合词
通过普通的方法写明显会超时(O(n~2)),但可以通过先把单词放入map中,然后通过对每个单词进行操作,把单词拆成两个能否在map中找到与之匹配的,若匹配输出,(O(mn))以下这段代码为超时的代码#include<stdio.h> #include<vector>#include<queue>#include<map>#include<cstring>#include<sstream>原创 2016-08-12 10:23:53 · 318 阅读 · 0 评论 -
HDU 1007 通过分治算最近对问题
这题主要就是几何问题中的分治 将集合划分为S1和S2,根据平衡子问题原则,每个子集中大约有N/2个点,设集合S的最近点对为P1和P2; 1.最近点对在集合S1中; 2.最近点对在集合S2中; 3.最近点对在集合S1和S2中; 对于情况1和2比较简单直接递归求解;但第三种情况稍微麻烦一些,在1,2的基础上求中间两边的点距离在1和2中的dmini值内可能存在的情况点,在那这些点进行计算和之进行原创 2016-11-03 12:31:53 · 248 阅读 · 0 评论 -
归并排序
归并排序分治策略的典型题目; 这题相对比较简单主要通过递归调用,吧问题分而治治; 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可#include<stdio.h>void merge(int r[],int r1[],int s,int m,int原创 2016-11-03 12:45:13 · 177 阅读 · 0 评论 -
快速排序
该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数#include<stdio.h>int partition(int r[],int first,int end) //划分 { int i=first,j=end;原创 2016-11-03 12:55:21 · 173 阅读 · 0 评论 -
堆排序
堆排序和快速排序的类似,堆排序主要通过完全二叉树或者是近似完全二叉树,然后移走堆顶元素,重新建堆,重复操作就是了;#include<stdio.h>void siftheap(int r[],int k,int n) //大根堆的实现 { int i,j,temp; i=k;j=2*i+1; //置i为要筛的节原创 2016-11-03 13:11:23 · 257 阅读 · 0 评论 -
HDU5971, 2016ACM/ICPC亚洲区大连站第一题
解这题的关键是通过假设先判断,给出的关系中是否能够能够分陪选手危害坏选手,第二部判断已给出的好选手与假设的是否矛盾,若矛盾则假设的之相反,在进行已知坏选手的判断,若矛盾则输出NO;#include<stdio.h>#include<string.h>int main(){ int n,m,x,y,a[1005],c1,c2,c3,flag,flag2; while(scanf(原创 2016-11-10 12:56:29 · 338 阅读 · 0 评论 -
水体
水体,直接解#include<stdio.h>int bin[1001];int findx(int x){ int r=x; //while(bin[r]!=r) r=bin[r]; if(bin[r]!=r) return findx(bin[r]); return r;}void merge(int a,int b){ int c1,c2;原创 2016-09-22 08:35:28 · 271 阅读 · 0 评论 -
hdu1233最短路问题使用
使用并查集加使用克鲁斯卡尔算法,水体直接解;#include<stdio.h>#include<algorithm>using namespace std;int bin[5005];struct In{ int p1,p2; int v; }s[5005];bool compare(In a,In b){ return a.v < b.v;}int find原创 2016-09-22 08:39:22 · 212 阅读 · 0 评论 -
hdu1863
直接贴代码#include<stdio.h>#include<algorithm>using namespace std;int bin[5005];struct In{ int p1,p2; int v;}s[5005];bool compare(In a,In b){ return a.v<b.v;}int findx(int x){ int r=x;原创 2016-09-22 08:43:26 · 146 阅读 · 0 评论 -
hdu5773The All-purpose Zero,1257最少拦截次数
这次的两题都是求连续的递增序列,我主要是用求最长连续子序列的方法解决的,核心(int po=lower_bound(ans,ans+len,b[i])-ans;),理解这句代码,节能解决一类题#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int a[100001],ans[100001],b[100原创 2016-07-31 09:04:10 · 306 阅读 · 0 评论