- 博客(18)
- 资源 (1)
- 收藏
- 关注
转载 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
题目中包括三个小的问题,由简单到复杂: 1,如果只有一个出现一次,考察到异或的性质,就是如果同一个数字和自己异或的活结果为零,那么循环遍历一遍数组,将数组中的元素全部做异或运算,那么出现两次的数字全部异或掉了,得到的结果就是只出现一次的那个数字。 2,如果有两个只出现一次的数字,设定为a,b。也是应用异或,但是数组元素全部异或的结果x=a^b,因为a,b是不相同的数字,因此x肯定不为0
2013-12-29 12:51:16 879
转载 在 ACM竞赛中,为什么美国的公认的计算机名校,如 MIT,斯坦福、加州伯克利、卡内基梅隆,表现不如中国和俄罗斯的高校?
知乎上看到的比较好的解释: 是这样,我在美国念书,去年的时候我参加regional比赛时我们赛区有些非常出名的计算机学校,但是我们很轻松的就把他们秒杀了,还差一点进final。其实这个问题说起来很好解释,我上大学之后明显编码水平下降了, 因为在北美念书你会发现主要做的都是一些开创性的工作,整体教育体系是不赞成学生做大量重复性工作的。在美国主要是培养的你的一种学习和创新的能力,也就是为什么美国
2013-12-26 16:10:39 832
原创 Sicily1350(并查集)
#include #include #include using namespace std; int parent[1000005]; bool hash[1000005]; int getpar(int a) { if (parent[a]!=a) parent[a]=getpar(parent[a]); return parent[a]; } int main() { i
2013-12-21 11:57:05 665
原创 Sicily7145(二分)
#include #include #include #include #include #include using namespace std; int A[100005],B[100005]; int search(int L1,int R1,int L2,int R2,int K) { if (L1>R1) return B[L2+K-1]; if (L2>R2) ret
2013-12-20 10:33:10 687
原创 POJ1830(异或方程组的高斯消元)
对于式子(((A^B)^B)^B)……,即A对B进行连续异或时,可以发现有如下规律: 若B为1,式子的值会在每次异或之后取反,因为0^1=1,1^1=0,…… 若B为0,式子的值会保持A值不变,因为0^0=0,1^0=1,…… 因而这种性质可以利用在POJ1830这样的有关联的开关问题上:(每个开关只能改变一次) 假设开关1和开关2、3相关联,且开关1的初始状态为0,终态为1,。 用1表
2013-12-16 01:12:36 1943
原创 归并排序(求逆序数对)
#include #include using namespace std; int A[1000005]; long long int ans=0; void merge(int l,int r) { int mid=(l+r)/2; int left[mid-l+1]; int right[r-mid]; int i; int lcount=0,rcount=0;
2013-12-15 21:25:46 571
原创 Sicily1345(能量项链DP)
A[j][i]表示从j个珠子开始到j+i个珠子的能量最优值。(若j+i>=n-1则取余) 比如对于样例数据(2,3)(3,5)(5,10)(10,2)。 假定从0开始计,A[0][2]即(2,3)(3,5)(5,10)的最优值,可能先聚合(2,3)和(3,5),再(2,5)和(5,10)聚合,也可能(3,5)和(5,10)先聚合,再(2,3)和(3,10)聚合。 用A表示则为A[0][2]等
2013-12-13 21:59:16 818
原创 Play with Digits(背包变形)
Description Prof. Meng likes playing with digits. He finds a store selling digits made from some expensive metal. Different kinds of digits may be sold at different prices, and we may assume that t
2013-12-12 01:10:57 1006
原创 Sicily2014
DP算法: #include #include using namespace std; int main() { int m,n; scanf("%d%d",&m,&n); int dp[305]={0}; int i,j; int A[10]; for (i=n;i>=1;i--) scanf("%d",&A[i]); //dp dp[0]=1; for (i=
2013-12-11 14:00:20 574
原创 Sicily2015
参考自:http://blog.csdn.net/lyhvoyage/article/details/12239757 // Problem#: 2015 // Submission#: 2527950 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Un
2013-12-10 15:59:17 445
原创 Sicily2011(预处理广搜)
题目包含多组测试数据,一开始没有注意直接广搜TLE,需要先进行预处理,记录好每个状态到达最终状态的路经长,最后直接输出才不会TLE。 用到了康托展开记录状态,用来判断是否被访问过。 需要注意的是,这里在队列里存储的元素不是康托展开的数。若直接存储康托展开的数,则在进行状态转换时需要进行逆展开成数组再变换或者进行比较麻烦的处理。 因此我在队列里直接存储的是数组而不是康托展开的那个数。 #in
2013-12-08 15:14:07 563
原创 康托展开与逆展开
int cantor(int A[]) { int i,j,temp,num; num=0; for (i=0;i<8;i++) { temp=0; for (j=i+1;j<=8;j++) if (A[j]<A[i]) temp++; num+=fac[8-i]*temp; } return num+1; }
2013-12-08 11:15:30 590
原创 筛法求素数
void pri() { memset(prime,true,sizeof(prime)); for (int i=2;i<=sqrt(max);i++) if (prime[i]) for (int j=i<<1;j<=max;j+=i) prime[j]=false; for (int i=2;i<
2013-12-06 10:06:21 592
原创 POJ2457(广搜)
需要输出路径,一开始没理清思路搞错了。 pre数组用来记录每个节点的父节点,记录路径。 #include #include #include #include using namespace std; bool vstd[50005]={false}; int pre[50005]; struct Vertex { int in,out; int pos; }A[50005];
2013-12-05 20:57:06 612
原创 寻找第k大数(快排思想)
剔除了相同的数,快排是从小到大排序的,所以k做了处理。 #include #include using namespace std; int hash[20000005]={0}; int A[10000005]; int counter=0; int k; int partition(int *A,int l,int r) { int x=A[r]; int i,j;
2013-12-04 20:21:56 1422
原创 Sicily1781(广搜)
#include #include #include #include using namespace std; int A[505][505]; int vstd[505][505]; int main() { int T; scanf("%d",&T); while (T--) { memset(vstd,0,sizeof(vstd)); queue Q; qu
2013-12-04 18:38:07 550
原创 Sicily9564
用线段树做还是超时,百度了一下发现有简便算法。 #include #include #include #include #include #include using namespace std; int xmin[1000005]={0}; int xmax[1000005]={0}; int ymin[1000005]={0}; int ymax
2013-12-03 20:50:03 521
原创 Sicily1767(双线程动态规划)
NOIP2008传纸条,有点神奇的动态规划。 重合时赋值为0,则不会出现重合的情况。 #include #include #include #include using namespace std; int dp[110][52][52]={{{0}}}; int main() { int m,n; while (scanf("%d%d",&m,&n)!=EOF) { mem
2013-12-01 00:52:29 892
iPhone开发基础教程.pdf
2014-07-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人