紫书解题报告——一定要总结经验

从第四章开始,之前的都很容易一遍ac
vj紫书链接

题意请看紫书,有对应页码

第四章:函数和递归

73页 Ancient Cipher UVA - 1339

重排不仅是有无数可能,同时也是可以是不管顺序,更简单!
只有出现次数需要记录。

79 Hangman Judge UVA - 489

1.出错:
有一个记录这轮有没有找到的
故猜完了就break,后面的不要再记录了,否则win变chickened out
2.加快效率:
记录还剩下多少个,不为0继续
比检查还有没有没去掉的快

82 The Dole Queue UVA - 133

1.循环——取模运算
a[n]中第i号(从1到n)
p= (i+n-1) %n+1;
//知识:-1%n=n-1,
//考虑到1到0,转到n,不可以 p= i %n;
走过,就修改一下,以后只记没修改的就好
2.从1开始数k个,到k,2k,…,那要从0+k开始
相应的,从n开始倒数m个,到n-m+1,n-2m+1,…,那要从n+1开始
相当于哨兵节点,方便很多
(按上面取了余,则分别是n和1)

83 Message Decoding UVA - 213

1.想法:
妙,空间换时间。
直接开code [8] [1<<8] , 把目标字符串存在对应位置
2.注意换行,可把getchar()改为不读换行"\n or \r"的函数
这题挺有意思,代码:

#include<stdio.h>
#include<string.h>
//#include<math.h>
//#include<iostream>
//#include<algorithm>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
int code[8][1<<8];
int readchar()
{
    
    
	char ch;
	while(1)
	{
    
    
		ch=getchar();
		if(ch!='\n'&&ch!='\r')return ch;
	}
}
int readcode()
{
    
    
	if((code[1][0]=readchar())==EOF)return 0;
	for(int len=2;len<(1<<3);len++)
	{
    
    
		int m=(1<<len)-1;
		for(int cnt=0;cnt<m;cnt++)
		{
    
    	
			code[len][cnt]=getchar();		
			if(code[len][cnt]=='\n'||code[len][cnt]=='\r')return 1;
		}
	}
	return 1;
}
int readint(int t)
{
    
    
	int s=0;
	while(t--)
	{
    
    
		s=s*2+readchar()-'0';
	}
	return s;
}
int main()
{
    
    
	while(readcode())
	{
    
    
		for(int len=readint(3);len;len=readint(3))
		{
    
    
			for(int cnt=readint(len);cnt!=(1<<len)-1;cnt=readint(len))
			{
    
    
				putchar(code[len][cnt]);
			}
		}
		putchar('\n');
	}
	return 0;
}

85 Spreadsheet Tracking UVA - 512

1.关于重复的教训
循环内分支,比分支内循环,代码简洁不易错
如果复制粘贴,经常有的字母忘记改。只要不卡常,以后怎样copy最少用怎样,时间的常数比copy的错误危害小多了
2.关于结构下数组序号的教训
容易cmd[i].x[j]写成都是i,
或者二重循环就也错了
要注意
3.思路妙:
将所有操作保存,然后对于每个查询,对该格进行每个操作。
不需要整个电子表格一起变化,会更好写,更高效

89 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) UVA - 12412

1.建议写一段前先把想到的注意点都注下,防止分心忘记,很多就错在这里
2.//发现错误的方法:多加了几个重名人 ,即让数据更大一些
3.查询时,我用了是排名成绩的sort方法
但是错了,因为读英语有
//in the same order they’re added to the database.
紫书上是一个a[i]只用一次,不会删除后再利用解决进入时的顺序问题
//所以排序还不行,并且如果要改对,连储存方式都要改,还是看看紫书算了
//英语要好
4.浮点数误差:
When formatting a floating-point number such as Average Score, a good way to prevent floating-point errors is to add a small number (like 1e-5 in this problem). Otherwise, 80.315 would be printed
as 80.31 if the floating-point error makes it 80.31499999…
即内部存的是有误差的,四舍五入可能出错,所以要+EPS防止出错

猜你喜欢

转载自blog.csdn.net/qq_51945248/article/details/115151879