跳至正文

USACO 3.2.3 Spinning Wheels 解题报告

  • OI路程

转360次就一定会转回来,刚开始我还在想应该使用最小公倍数吧,后来想了想才发现用360就可以了,用最小公倍数麻烦的多,甚至可能还慢些! 然后忽然发现比较麻烦的一个地方就是每个轮子有5个孔,不好放在循环里,不知道怎么弄,看了下别人的建议,发现我好傻,直接使用数组记录就可以了,:-),每个空隙在数组中+1,最后等于5的就是。但是现在觉得可能这么也不好,因为如果出现了某一个轮胎上两个孔重叠不就可能出问题了,但是这个只出现在数据上,不合逻辑所以就没有这种数据吧,所以我AC了,但是这还是要考虑下,如果这样的话,还是是用数组,但是不用+1了,而是用二进制,每个轮胎的缝隙不+1而是把这个轮胎所在的那个位置1,不过其实都是多虑了,代码如下: de lang="c"> / LANG: C ID: yylogoo1 PROG: spin / #include #include int used[360]; struct ro{ int v; int count; struct bug{ int start, width; }bug[5]; }roll[5]; int check(void) { int i, j, k; struct bug t; for(i = 0; i <5 i forj="0;" j rollicount j t="roll[i].bug[j];" fork="0;" k="t.width;" k usedk tstart fori="0;" i i ifusedi>= 5){ return 1; } } memset(used, 0, sizeof(used)); return 0; } int main(void) { int i, j, k; struct bug t; freopen("spin.in", "r", stdin); freopen("spin.out", "w", stdout); for(i = 0; i <5 i scanfdd rolliv rollicount forj="0;" j rollicount j scanfdd rollibugjstart rollibugjwidth fori="0;" i i ifcheck break forj="0;" j j fork="0;" k rolljcount k rolljbugkstart="(roll[j].bug[k].start" rolljv ifi="= 360){" printfnonen return printfdn i return code>

发表回复

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