http://codeforces.com/contest/675
A. Infinite Sequence
题意:给出等差数列的首项a以及公差c,问数b是不是该数列中的数,若是输出YES否则输出NO。
思路:第一种情况是a==b,这时不论公差c为多少,都是YES;当a!=b时,则要求同时满足:
(1)c!=0; (2)(b-a)%c==0; (3)(b-a)/c>0 (即b-a要和c同号)。
代码:太简单了就不贴了
B. Restoring Painting
题意:有这么一个3×3的格子,在?处填入1-n之间的一个数,不同的?处填的数字可以相同也可以不同,但都需满足条件:每个2×2的格子内数字和==左上角的2×2格子内的数字和。 问共有多少种填法?
思路:a,b,c,d已经给出,那么设
可以列式:y+c=x+b z+d=x+a w+d=y+a
于是得到: y=x+b-c z=x+a-d w=y+a-d
于是遍历x的值(从1到n),只要y,z,w同时满足1<=y,z,w<=n,则ans++
最终共有ans*n种填法(为什么要*n,因为在满足上述的等式下,中间的m可以填1-n中的任意数)。
代码:不贴。
C. Money Transfers
题意:共有n个银行,依照第1个银行、第2个、……、第n个银行围成一圈,现在每个银行都有一定的钱数,可能为负值(代表欠钱)。为了让每个银行的钱数全部归零,现在可以进行银行间的转账,但规定转账只能在相邻银行之间进行(第1与第n 相邻),问让所有银行的钱数归零的最少的次数?(给出的数据已经保证一定能够全部归零)
思路:因为只在相邻之间进行,最多就是n-1次,从头至尾,找到后面那些钱数为0的银行,那些是不需要动的,额说不清楚,看代码吧。
代码://话说map的这个用法真是用起来爽得很。
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; int main() { int n,a; map<long long,int> m; long long sum=0; scanf("%d",&n); int ans=n-1; for(int i=0;i<n;i++) { scanf("%d",&a); sum+=a; m[sum]++; ans=min(ans,n-m[sum]); } printf("%d ",ans); return 0; }