Programming Challenges
文章平均质量分 66
深蓝色的猫
一个努力成长为大牛的蒟蒻程序媛
展开
-
UVa OJ 10082
1、灵活运用字符串常量。#include using namespace std;char *s="`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";int main(){ int i,c; while((c=getchar())!=EOF) { for(i=1;s[i]&&s[i原创 2013-08-19 14:10:39 · 264 阅读 · 0 评论 -
UVa OJ 10161
1、找规律题,容易出错,多弄些测试数据。#include int main(void){ int count,n,minus; while(scanf("%d",&n)==1) { if(n==0) break; count=1; while(count*count coun原创 2013-02-22 23:45:31 · 274 阅读 · 0 评论 -
UVa OJ 100
1、终于把这道题AC了,注意两点:1、temp要用long long,2、充分利用已有结论。#include #include #include using namespace std;int i,j,k,a[1000010],cnt,ans;long long temp;int main(){ memset(a,0,sizeof(a)); a[1]=1原创 2013-08-19 15:46:25 · 319 阅读 · 0 评论 -
UVa OJ 10054
1、我想说本题又创下了提交次数历史新高。。。2、刚开始我以为题目很复杂,因为项链可以反着串,所以是“一个非常复杂的有向图,每两个结点之间是双向可达的”,其实根本不是这么回事,“非常复杂的有向图”实际上只不过是无向图而已。2、输出可以采用stack,也可以在递归时就简单地把两数调换下位置输出(因为有多种答案,任意输出一种即可),不过还是建议用stack,练练手嘛。3、刚开始反复RE,原来原创 2013-08-20 16:39:32 · 424 阅读 · 0 评论 -
UVa OJ 10034
1、本题是求最小生成树,权值就是两点间距离,因为题目给出的信息是以点为中心的,所以选择用prim算法。一次AC~#include#include#includeusing namespace std;typedef struct{ double x,y;}point;point p[110];int parent[110];bool intree[110原创 2013-08-21 16:25:41 · 288 阅读 · 0 评论 -
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 · 267 阅读 · 0 评论 -
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 · 304 阅读 · 0 评论 -
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 · 297 阅读 · 0 评论 -
UVa OJ 10038
#include#include#includeusing namespace std;int a[3010],vis[3010];int main(){ int n,num; int ch; bool flag,minus; while(scanf("%d",&a[0])==1){ flag=true;n=0;num原创 2013-09-01 23:58:51 · 368 阅读 · 0 评论 -
UVa OJ 10018
1、由于对string类不熟悉,犯了好多次内存错误~不过终于AC了。#include#include#include#includeusing namespace std;const int maxn=1000;struct bign{ int len,s[maxn]; bign(){memset(s,0,sizeof(s));len=1;}原创 2013-09-02 23:12:55 · 324 阅读 · 0 评论 -
UVa OJ 10012
1、这道题的难点就在于“圆”,圆会相切,圆有大有小,所以要考虑各种情况。2、用回溯法,每次添加一个新圆的时候,这个新圆可能与前面任一个圆重叠,所以要全部扫描一遍,求出位于最右边的圆心位置,存入b数组。3、还要小心两端,每次添加新圆的时候,还要考虑是否和最左边的板重叠,而在计算最右边的板的位置的时候,要注意任何一个圆都可能与之相切。#include#include#include原创 2013-10-29 22:01:13 · 334 阅读 · 0 评论 -
UVa OJ 10177
1、本题要求找规律,注意求长方体的个数用排列组合知识:C(n+1,2)*C(n+1,2)是边长为n的正方形所包含的长方形个数,注意题目区分了正方形和长方形,因此所得到的长方形数要减去正方形数(n^2+(n-1)^2+……+1^2)。更高维的依此类推。就是考不完全归纳法。#include int main(void){ long long int n; while(s原创 2013-02-25 23:37:46 · 323 阅读 · 0 评论 -
UVa OJ 116
1、用long long保存。2、三个方向取最小,别忘了加上本身格子里的值。3、-和4、题目要求字典序最小,所以单独考虑相等的时候。5、利用循环队列的思想,因为可以超出范围,所以先搜索到的不一定是字典序最小(如按上中下顺序搜索的话,先搜到4,再搜到0,再搜到1,但是4>0),所以要单独写一个比较语句。#include#include#includeusing nam原创 2013-08-08 19:31:02 · 367 阅读 · 0 评论 -
UVa OJ 10152
1、因为通过率比较低,还以为过不了,没想到一次AC~2、主要思路就是从底向上扫描,遇到不符合正常次序的就把count加上一,最后按第二张表倒序输出即可。具体见代码。#include#include#includeint main(void){ int K,n,i,j,count; char s1[200+10][80+5]; char s2[2原创 2013-06-02 17:50:05 · 502 阅读 · 0 评论 -
UVa OJ 10194
1、第一次写这么长的程序,232行……2、共交了4次才过。第一次因为想当然,受到样例影响,认为题目说的“不区分大小写”是废话,所以没有对队伍的名称进行预处理,导致错误。3、第二次陷入死循环,以为是OJ系统错误,于是把同样的程序再交一遍,果断TLE。4、经检查发现忘记写j++了(真是容易忘啊),改掉后就AC了。#include #include #include type原创 2013-02-22 20:55:55 · 283 阅读 · 0 评论 -
UVa OJ 10131
1、刚开始没找好状态,dp(i)应为从i结点出发的最长下降子序列长度,而不是i结点及其以后的最长下降子序列长度。记忆化搜索保证了不超时,所以放心枚举。2、运算符重载后用sort函数做一个预处理,使所求数据变成对于w升序对于s降序,然后求最长下降子序列即可,用fa数组保存路径。3、题目可能有多种答案,任意输出一种即可。#include#include#includeusing原创 2013-08-11 17:48:03 · 333 阅读 · 0 评论 -
UVa OJ 10047
1、这道题乍一看让人摸不着头脑,因为和普通的bfs不同,如果颜色不达到要求,即使到了终点也不能结束程序。这就意味着已访问过的结点还可以访问。这要怎么办呢?我没有想出来,上网查后才知道vis最初的定义原来是标记“状态”,而不是“格子”,所以我们有必要用一个四维的vis数组来记录某状态是否访问过,状态包括横坐标、纵坐标、方向、颜色。2、刚开始我是枚举四个方向,不知为何总是WA,调试了很久也没有结果原创 2013-08-18 00:33:31 · 328 阅读 · 0 评论 -
UVa OJ 10050
1、纯模拟。好久没做到这么水的题了~#include #include using namespace std;int main(void){ int T,day,n,i,j,count; int h[110],d[3700]; scanf("%d",&T); while(T--) { memset(h,0,s原创 2013-08-02 10:13:42 · 380 阅读 · 0 评论 -
UVa OJ 10010
题目比较简单,注意要点如下:1、scanf语句读了字符串不会读\n,所以要用getchar()消去\n。2、八个方向循环时注意先判断是否越界。3、除最后一行外,输出每行后再输出一空行。除第一行外,要用两个getchar()消去输入中多余的两个回车。#include #include #includeint judge(int i,int j,int len);int原创 2013-01-27 21:41:35 · 343 阅读 · 0 评论 -
UVa OJ 120
1、本题WA了两次,因为理解错了题意,以为只要最上面是最小值,最下面是最大值即可,而题目的意思是从小到大递增。(由此可见,学好英文多么重要。)2、先用快排,将结果保存在sorted,自底向上将a每次与sorted比较,如果不同则交换。保证已经遍历过的ai都与sorted一致即可。#include #include int a[40]={0},sorted[40]={0};cha原创 2013-02-08 15:07:22 · 309 阅读 · 0 评论 -
UVa OJ 846
1、刚开始漏了两个数相等的情况。做这种数学类杂题一定要注意边界条件。多考虑几次,多试几个测试数据再交。2、思路就不讲了,看程序很容易理解。总之,就是在可能范围内尽量形成比较大的数字,越大越好。#include #include int main(void){ int n,a,b,m,i,x,y,temp; scanf("%d",&n); while原创 2013-02-24 20:19:13 · 278 阅读 · 0 评论 -
UVa OJ 10110
1、不要从1开始枚举,因为只要判断n的平方根是否为整数即可。2、用int是WA,改为unsigned int就AC了,不知道为什么。#include #include int main(void){ unsigned int i,n; while(scanf("%u",&n)==1) { if(!n) break;原创 2013-02-23 00:36:12 · 278 阅读 · 0 评论 -
UVa OJ 705
1、这题乍一看让人摸不着头脑,因为斜线来分隔的迷宫实在是太难用数组表示了,实际上有一种表示方法,例如“\”表示成2 0,"/"表示成0 1原创 2013-07-29 18:40:22 · 499 阅读 · 0 评论 -
UVa OJ 10003
1、本题刚开始TLE。我认为dp【0】【N】即为区间(0,L)上的最小费用,虽然实际上运算次数并不多,但是每次初始化时,要初始化一个1000*1000的数组,这样测试数据一多就很容易超时。仔细想想,其实1000*1000的数组很多地方都没有用到,故改成50*50的数组即可,省了一大笔空间,也就省了一大笔初始化的时间。#include #include #include using原创 2013-08-08 16:48:32 · 393 阅读 · 0 评论 -
UVa OJ 701
1、终于把这道题给A啦~两个月前还不会的,当时很沮丧想怎么连这都不会,今天发现原来是区域赛题目,黑书上226页有讲解~2、我就不讲了吧,具体见黑书吧,要提一下的就是——总能找到答案,只要i足够大的话。我刚开始因为担心造成死循环所以i大于100的时候就跳出循环了,结果WA,后来去掉那句话之后就AC了。 #include#includeusing namespace std;i原创 2013-11-01 15:08:55 · 306 阅读 · 0 评论