我已经回答了这个问题,当时我正在阅读其他人的代码。这是问题链接:http://codeforces.com/contest/621/problem/B 我试图了解如何接受此代码:
UPDATE exp
SET EXP.Status = 'COMPLETE'
FROM TBL EXP
WHERE EXP.ID IN (1, 2, 3) AND
EXP.Status = 'APPROVED';
我一直在想很多,但我不了解该算法。有人知道吗?另外,cstdio的作用是什么? (我不太熟悉c ++,而且我是编程的初学者)
答案 0 :(得分:0)
问题是给您主教在大棋盘上的位置,并且您要计算共享一条对角线的主教对的数量(即,如果没有其他主教妨碍,则可以互相攻击)
使此代码起作用的见解是,您可以从一个空的木板开始,并通过说每个对都在木板上已经存在的主教与要添加的新主教之间来考虑所有可能的主教对。
这里的基本算法是a
计算沿一个方向(如果x跨度为y且y向下为数,则从左上到右下)运行的每个对角线上的主教的数目,而{{1} }计算沿另一个垂直方向(从右上到左下)运行的每个对角线上的主教的数量。
您可以使用b
来获取当前主教落在左上到右下的对角线上。它将与已经放置在对角线上的其他主教形成一对,因此您将x+y
添加到您的总和中。然后增加a[x+y]
,因为您只是在对角线上放了一个新的主教。
与另一个对角线相似:用a[x+y]
算出要去的对角线,将已经在对角线上的主教的数目(以及由此形成的新对的数目)加到总和中,然后递增对角线的主教计数。
这里的x-y
可以防止数组索引变为负数,因为当1000+
为0时x-y
可以为负数。由于程序员没有将数组做得太大,弄清楚它们可以安全地小到什么程度。该程序利用了C++ standard的规则3.6.2,该规则保证静态存储持续时间变量(如所有全局变量)将被初始化为0。