CF Round #353 Div.2

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格子内的数字和。  问共有多少种填法?

                                                                image

思路:a,b,c,d已经给出,那么设

                                           image

            可以列式: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\n",ans);
    return 0;
}

posted @ 2016-05-27 10:06  &ATM  阅读(166)  评论(0编辑  收藏  举报
……