- 博客(117)
- 资源 (1)
- 收藏
- 关注
原创 Round #198 (Div. 2) A、The Wall
1、题目链接:http://codeforces.com/problemset/problem/340/A2、昨晚给虐惨了,这是唯一一道做出来的,求【a,b】内的所有“x,y的最小公倍数的倍数”。注意边界可能不像样例一样是倍数,所以要处理一下,稍稍缩小范围。3、说起来这个程序还成功躲掉一次hack呢。。。那个人hack了将近10个选手的程序,只有我这个没成功,否则这回就要爆零了。。。伤不起
2013-08-31 20:12:31 308
原创 USACO Milking Cows
1、本题刚开始不知如何下手,经思考后想到可以根据区间左端排序,但要注意就是每次应该和“最右区间”相比,而不是和“前一个区间”相比。区间不一定是平行四边形的也可能是倒三角形的。/*ID:mrxy564PROG:milk2LANG:C++*/#include #include using namespace std;struct Interval{ int
2013-08-30 21:55:31 329
原创 USACO Broken Necklace
1、刚开始我是分类讨论,判断是否到边界,到边界后处理指针到另一端。。。写出来非常麻烦。后来想到将字符串*2,也就是让两串珠子连在一起,这样就不用判断头尾了,只要“顺时针”判断就可以了。2、刚开始WA了一次,因为我想当然地认为一定会有珠子颜色数>=2,其实可以是单色的。改后AC。/*ID:mrxy564PROG:beadsLANG:C++*/#includeusing
2013-08-30 14:19:18 312
原创 USACO Friday the Thirteenth
1、刚开始觉得无从下手,仔细考虑后发现其实只要遍历每一天,然后让星期数周而复始,遇到13就加一,再加一个对于闰年的判断即可。/*ID:mrxy564PROG:fridayLANG:C++*/#include #include using namespace std;int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,3
2013-08-30 12:51:15 338
原创 UVa OJ 160
#include#includeusing namespace std;int is_prime(int n) { for(int i = 2; i*i if(n % i == 0) return 0; return 1;}int prime[100], count = 0;int main() { int n, p[100]; for(
2013-08-29 22:39:15 299
原创 UVa OJ 143
#include#include#includeusing namespace std;const int FACTOR = 100;bool left_or_on(int x1, int y1, int x2, int y2) { return x1*y2 - x2*y1 >= 0;}int main() { double x1_, y1_, x2_, y
2013-08-29 22:14:22 252
原创 UVa OJ 12233
#include#include#include#include#includeusing namespace std;const int MAXTIME = 12;const int INF = 100000000;const string name[] = {"Y", "H", "L", "M"};int SY_jing, XX_su, SY_su, yur
2013-08-29 19:54:09 395
原创 UVa OJ 1400
#include#include#includeusing namespace std;const int maxn=500000+10;const int maxnode=1000000+10;typedef long long LL;typedef pairInterval;LL prefix_sum[maxn];LL sum(int L,int R){
2013-08-29 19:20:08 310
原创 UVa OJ 11235
1、RMQ问题的变形,注意p增加的时机。一次AC~#include#include#includeusing namespace std;int value[100010],cnt[100010],num[100010],left[100010],right[100010];int main(){ int n,p,q,last,L,R,ans,temp; w
2013-08-29 11:01:42 304
原创 UVa OJ 10137
1、这题在精度上做文章,本来以为只要把所有大于平均值的部分相加或者所有小于平均值的部分相加就是答案,但是误差是会累积的,两者可能并不相等,因此选择较小的那个输出。在算平均值的时候,四舍五入可以减小误差。#include#includeusing namespace std;int main(){ int n; double sum,ave,ans,ans2,a[10
2013-08-28 23:48:00 294
原创 UVa OJ 11029
1、又见一道好题。。。求n的k次方的后三位和前三位,后三位可以用快速幂取模,前三位可以借助对数,因为取对数后再取零(去整),再作为10的指数求幂,就得到所需的数的科学技术法形式,乘以100就得到前三位了。例如123456=1.23456*10^5,取lg后得lg1.23456+5,用强制类型转换可以得到lg1.23456,再求幂得1.23456,乘以100,取整后得到123,即前三位。2、注意
2013-08-28 23:01:42 319
原创 UVa OJ 571
1、发现我的数论真是弱到不行。。。刚开始看到这题的时候以为是隐式图搜索。。。但是没注意到一点就是两个水杯的容量是互质的,也就是说,na mod b能求出0~b-1的所有值(没有严格的证明),所以只要一直从A往B倒水就可以了。。。#includeint main(){ int ca,cb,n,a,b; while(scanf("%d%d%d",&ca,&cb,&n)==3
2013-08-28 21:13:13 265
原创 UVa OJ 196
1、好题啊~涉及的知识点很多,要吐槽一下的就是题目比较吓人,列最多达到ZZZ,那数组可能有18000列!怎么想都RE吧~看了别人的题解,发现只要开到1010就可以了,这题目,纯粹是忽悠人。。。2、其实用DFS就可以做了,有人说用拓扑排序,大同小异,拓扑排序也是dfs啊,而且本题不可能有环,也就是不可能有互相调用的两个格子,所以放心dfs。采用记忆化搜索可以提高时间效率。3、本题还用了ato
2013-08-28 19:49:39 425
原创 UVa OJ 10305
1、纯拓扑排序。。。在想这么水的题怎么会WA,后来才发现不应写whlie(scanf("%d%d",&v,&e)==2&&v&&e),而应是while后加上if(!v&&!e) break,因为e可以为0!这时也要输出东西来,因为e为0代表对顺序没有要求,不是输不出排列!2、以后一律采用第二种方案读入!不过交了后却发现还是WA,仔细查后发现忘记using namespace std了,加上后果
2013-08-28 17:43:08 453
原创 UVa OJ 10596
1、判断无向图是否存在欧拉回路,两个条件:1、图连通,2、所有点度数为偶数。一次AC~#include#includeusing namespace std;int v,e,G[210][210],x,y,d[210],vis[210];void dfs(int u){ vis[u]=1; for(int i=0;i if(G[u]
2013-08-28 16:48:06 331
原创 UVa OJ 10189
1、做个水题放松一下~注意一定要确定n和m是否大于0,否则会输出多余的东西。#include using namespace std;int main(){ //freopen("a.txt","r",stdin); int n,m,kase=0; int x[8]={-1,0,1,0,-1,1,-1,1}; int y[8]={0,-1,0
2013-08-27 23:53:59 263
原创 UVa OJ 10820
1、满足条件的是两数互为素数的时候,刚开始用gcd+暴力理所当然地TLE了。后来上网查后发现应该用欧拉函数。注意欧拉函数只能求出“组合”,而不是“排列”。换句话说,求4以内的互素的组合只有(1,4),(3,4)。事实上题目还要求(4,1),(4,3)。所以算出整数后乘以二。但由于(1,1)也互素,且没有逆序对,所以在最终结果减一。具体见代码。#include #include usin
2013-08-27 23:19:39 249
原创 UVa OJ 327
1、终于AC了~WA了快十次了。。。好吧我激动了~按照惯例,还是分点说一下得到的经验。2、本题虽然在“二叉树”分类里,但我觉得逐字符处理更方便。注意原式中有好多空格,预处理的时候要消去。否则在判断加减号是否是前后缀的时候非常麻烦!!!3、注意访问的时候不要越界,比如i=0时就不要访问a【i-1】,我就是因为这个错了一次。4、注意“表达式的值”的定义。++a的值为2而a++的值为1。
2013-08-27 21:12:18 398
原创 UVa OJ 699
1、通过本题,学习了“表示出空节点”的字符串的建树方法。用数组来模拟树,这真是个十分巧妙的想法,加深了对二叉树递归性质的理解。2、刚开始我把数组开到50,因为题目说输出不会超过80个字符位置,我想最多就40个结点吧,开到50保险一点,然后以25作为根节点,没想到WA了。仔细想后才发现:谁也没有说过树是左右对称的,有可能四十个结点全在树的左边或右边,那样25显然不够。而且和平常做过的题相比,这点
2013-08-27 18:00:21 451
原创 UVa OJ 712
1、题目描述很长,实际比较简单。我一直觉得二叉树和二进制的关系很微妙。。。其实走的路线完全可以看作是一个二进制数(从高位到低位),算出的值就对应叶子节点的编号。一次AC~#include using namespace std;int main(){ int n,m,temp,ans,x[8],kase=0; char s[8][3],leaf[130];
2013-08-27 14:27:12 376
原创 Round #197 (Div. 2) D 、 Xenia and Bit Operations
1、题目链接:http://codeforces.com/problemset/problem/339/D2、我是真没想到用二维数组也可以做,本来还以为要用链表的,想想很麻烦,结果比赛还剩50多分钟就在那里干坐着。。。也有人说是线段树,但是我刚好卡在那里没看。。。ORZ。。。参考了某大牛的代码,自己写了下,很容易就AC掉了~这也算是“非主流”线段树了吧。#include using n
2013-08-27 12:48:22 869
原创 Round #197 (Div. 2) C.、Xenia and Weights
1、题目链接:http://codeforces.com/problemset/problem/339/C2、本题过了系统数据,但是没有过hack数据。我是用贪心法,从1开始搜索,尽量选小的砝码加,但是1110000000,4这个数据过不了,原因是我并没有考虑到全部情况,如果按我原来的方法,从1开始搜索,那么1,2,3后加不上砝码,就失败了,事实上2,3,2,3是可以过的。由此可见第一个砝码是
2013-08-27 10:36:37 741
原创 Round #197 (Div. 2) B、Xenia and Ringroad
1、题目链接:http://codeforces.com/problemset/problem/339/B2、模拟即可。#include using namespace std;int main(){ int n,m,temp,last; long long ans; while(scanf("%d%d",&n,&m)==2){
2013-08-27 09:37:30 597
原创 Round #197 (Div. 2) A、Helpful Maths
题目链接:http://codeforces.com/contest/339/problem/A1、读入的时候要小心。注意回车、加号等。#include #include #include using namespace std;int main(){ char ch; int a[100],n; n=0; while((ch=g
2013-08-27 01:31:25 336
原创 UVa OJ 10717
1、暴力法+lcm。注意保存最优值。#include using namespace std;const int INF=2147483647;int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}int lcm(int a,int b){ return a/gcd(a,b)*b;}int main()
2013-08-26 22:40:15 312
原创 UVa OJ 10791
1、这题我完全想错了。注意最小公倍数不等于公倍数。我以为用基本不等式可得“离平方根最近的两个数就是答案”,这也是建立在这个错误的前提上的。2、看了网上的题解,有一个我觉得比较详细的,摘抄如下:首先假设我们知道了一系列数字a1,a2,a3……an,他们的LCM是n,那么什么时候他们是最优解呢,当他们两两互质的时候为了方便我们以两个数来说明问题。a和b的LCM是n,GCD是m,那么n=
2013-08-26 21:44:46 311
原创 UVa OJ 11121
1、感觉最近做题正确率有所提高。。。2、本题是求一个数的-2进制,如果傻傻地按照二进制来肯定是错的啦~因为负数取余和我们想得不太一样。。。我的方法是遇到奇数的时候减一,再递归处理“这个数除以-2的值”,遇到偶数就直接递归处理“这个数除以-2的值”。一次AC~#include using namespace std;void bin(int n){ if(n==0) ret
2013-08-26 20:04:19 301
原创 UVa OJ 624
1、这是个0-1背包本题,加上一个打印路径,就不太好想。。。要和一维的时候区分开,p数组应是个二维数组才行。因为相同物品可能在不同状态下使用:例如一个背包剩余j1空间,一个剩余j2空间。打印路径时务必考虑剩余空间。刚开始没加(m==num+1)的情况,WA了一次。具体见代码。#include #include #include using namespace std;long
2013-08-26 17:52:20 353
原创 UVa OJ 348
1、求最优矩阵链乘。本来属于经典题,但是本题有一个难点就是要输出括号表达式,用回溯法即可(写了好久),注意空格。2、交的时候忘记删除freopen了,WA了一次。。。太冤了吧。。。#include#include#includeusing namespace std;const int INF=2147483647;int d[15][15],p[15],di[15][
2013-08-26 14:57:18 306
原创 UVa OJ 562
1、本题可以转化为0-1背包问题,选一些硬币装在背包中,使总价值不超过sum/2的前提下价值尽量大(这里权值就是价值)。2、刚开始读入a时从a【0】开始,WA了一次,应从a【1】开始。#include #include #include using namespace std;long long d[110][50010];int a[110];int main()
2013-08-26 12:15:19 303
原创 UVa OJ 357
1、又是分硬币问题。。。一次AC~#include #include #include using namespace std;long long d[30010][12];int v[5]={50,25,10,5,1};long long dp(int num,int pre){ long long &ans=d[num][pre]; if(ans>0
2013-08-26 11:07:08 298
原创 UVa OJ 10673
1、本题用扩展欧几里得即可。#include #include using namespace std;void gcd(int a,int b,int &d,int &x,int &y){ if(!b){d=a;x=1;y=0;} else{gcd(b,a%b,d,y,x);y-=x*(a/b);}}int main(){ int T,a
2013-08-26 00:00:21 357
原创 UVa OJ 106
1、这题是道典型的数论题。数论我没有系统学习过,也证不出别人那样严谨的步骤,只能背一下结论。膜拜大神!2、摘抄某位ACMer的解法,真的很不错:数论经典问题:构造本原勾股数组(PPT):a^2+b^2=c^2 , 其中a,b,c两两互质 1.证明a和b必定一奇一偶,并可以推导出c一定是奇数 。 证明后我们约定a是奇数,b是偶数,c为奇数,但a和b的大小不能确定2.a^2+b^2=c
2013-08-25 23:17:59 286
原创 UVa OJ 1428
1、本题是Fenwick树的应用。刚开始因为ans没写成long long所以WA了一次。看来以后这种累加“组合”的(无法估计总量),一定要用long long才行。#include#includeint a[100010],b[20010],c[20010],d[20010];int maxn;int lowbit(int x){ return x&-x;}
2013-08-25 21:09:42 292
原创 UVa OJ 1329
#include#includeusing namespace std;const int maxn=20000+10;int pa[maxn],d[maxn];int findset(int x){ if(pa[x]!=x){ int root=findset(pa[x]); d[x]+=d[pa[x]]; re
2013-08-25 17:15:21 285
原创 UVa OJ 1160
#includeconst int maxn=100000+10;int pa[maxn];int findset(int x){return pa[x]!=x?pa[x]=findset(pa[x]):x;}int main(){ int x,y; while(scanf("%d",&x)==1){ for(int i=0;i int
2013-08-25 16:22:42 318
原创 UVa OJ 11995
1、刚开始把输出的priority queue打成priority_queue了,WA了一次!唉!习惯的力量。#include#include#includeusing namespace std;int main(){ int n,order,temp; bool flag1,flag2,flag3; while(scanf("%d",&n)==1){
2013-08-25 15:35:24 338
原创 UVa OJ 128
1、刚开始没读懂题意,什么叫做把字符串看作数字?后来百度了下才知道,原来是将一个字符看作一个256进制的数(有8位,2的8次方是256)。2、注意题目要输出的是CRC值mod“g"后的十六进制数,所以将字符串转化为数字的时候要随时注意mod”g",然后再用g减去这个值即为CRC值。3、位运算的时候注意ans4、一次AC~发现数学类的题目虽然很难想,但是不像模拟题那样容易错。#inc
2013-08-25 01:00:20 304
原创 UVa OJ 10006
#include using namespace std;bool prime(int n){ for(int k=2;k*k if(n%k==0) return false; return true;}long long pow(long long x,long long n){ long long ret=1,mod=n;
2013-08-24 22:27:37 302
原创 UVa OJ 138
1、网上有人说解佩尔方程什么的,不用那么麻烦。刚开始我用暴力枚举,时间复杂度O(n^2),超时了,其实判断等式是否成立,只要判断开方后是否为整数即可。2、打表输出更快。具体见代码。#include #include using namespace std;int main(){ /*freopen("a.txt","w",stdout); int cou
2013-08-24 20:49:53 338
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人