跳至正文

USACO 2.3.3 Zero Sum 解题报告

  • OI路程

这个题目刚看到谁都觉得简单,爆容易,但是仔细一想,怎么去组合数字?怎么去把符号和数字放在循环里?都是需要解决的问题,我刚开始使用的是全局变量保存那些数据,忽然发现用全局的数据太复杂了,有好多数据需要改变再还原,所以只能用局部变量,每个函数拥有一套独立的参数变量,这样及时修改了也影响不到别的函数(这里有一种操作系统的感觉,一个程序被多次执行,每个进程独立的空间)。 这题谈不上什么算法不算法的,就是纯粹的暴力循环,每种情况都考虑一次。唯一要说的就是这个srch的参数: 1.now就是枚举的标示量,表示这是第几层枚举了。 2.dea是前面一个的操作方式,比如1 2 3 4+5 6现在now = 5(指向数字中的6)了,那么dea就是代表加法。它用1,-1来表示加减法,非常的快速,不需要任何判断。 3.tmp就是用空格组合成的数字,又如上面一个例子,那么就tmp=5,如果再前进一层1 2 3 4+5 6 7,那么tmp=56。 4.总共的累加和,还没有包括tmp的值。 最开始dea=1,即要把累积的数加起来,如果是空格就把数累加进tmp,如果是加法或减法,就把tmp放进sum中,并且自己作为tmp,dea设置成为加法或减法(1,2),然后继续循环。 / LANG: C ID: yylogoo1 PROG: zerosum / #include int sum; int tmp, n, dea; int used[9]; void output(void) { int i; printf("%d", 1); for(i = 1; i <n i switchusedi case printf break case printf break case - printf- break printfd i printfn void srchint now int dea int tmp int sum int t ifnow="= n){" sum="sum" dea tmp ifsum="= 0){" output return usednow="0;" srchnow dea tmp now sum sum="sum" dea tmp usednow="1;" srchnow now sum usednow="-1;" srchnow - now sum int mainvoid freopenzerosumin r stdin freopenzerosumout w stdout scanfd n srch return code>

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注