Codeforces Round #194 (Div. 2) 部分题解

http://codeforces.com/contest/334

A题意:1-n^2 平均分成 n 份,每份n个数,且和相同

解法 : 构造矩阵1-n^2的矩阵即可

int a[105][105];
int main()
{
    int n;
    scanf("%d",&n);
    int k = n*n;
    int c = 1;
    for(int i = 0 ; i < n ; i++)
        for(int j = 0 ; j < n ; j++)
            a[i][j] = c++;}
    for(int i = 0 ; i < n ; i++)
    {
        for(int j = 0 ; j < n ; j++)
            printf("%d ",a[j][(i+j)%n]);
        puts("");
    }
    return 0;
}

B:8个点能否关于矩形对称

解法: 直接暴力判断8个点,注意判重

struct point
{
    int x,y;
}p[8];
int cmp(point a,point b){
    if(a.x == b.x) return a.y<b.y;
    return a.x < b.x;
}
int main()
{
    for(int i =0 ; i < 8 ; i++)
        cin>>p[i].x>>p[i].y;
    sort(p,p+8,cmp);
    for(int i = 0 ; i < 8 ; i++)
        for(int j = 0 ; j < 8 ; j++)
            if(i != j && p[i].x == p[j].x && p[i].y == p[j].y)
            {
                cout<<"ugly"<<endl;
                return 0;
            }
    if(p[0].x == p[1].x && p[1].x == p[2].x && p[3].x == p[4].x
        && p[5].x == p[6].x && p[6].x == p[7].x)
    {
        if(p[0].y == p[3].y && p[3].y == p[5].y && p[1].y == p[6].y
            && p[2].y == p[4].y && p[4].y == p[7].y)
            cout<<"respectable"<<endl;
        else cout<<"ugly"<<endl;
    }else cout<<"ugly"<<endl;
    return 0;
}

C题意: 用面值为3的次幂的硬币 购买价值为n的商品 , 要求硬币总价值>n且硬币数最多且这些硬币的子集不能>=n

解法 : 贪心,如果非3的倍数一定是n/3+1 即全换成3

否则就不能换成3要换成面值更大的 以此类推直到不为3^k为止

int main() {
    LL n;
    cin>>n;
    while(n % 3 == 0) n /= 3;
    cout<<(n/3)+1<<endl;
}

D题意: 在n*n矩阵中 有一些不能走的格子, 从边界(非顶角)出发 能直线走到对面边界的最多方案数

解法 : 如果中间没有不能走的格子 ,对于在(x,x)上相交的十字形一共有2种不冲突的放法

可以证出: 其中一定存在一种对其他情况不影响走法 ----------------------------------画图可归纳

奇数情况特判中间点即可

bool bx[1005],by[1005];
int n,m;
int main()
{
    //freopen("in.txt","r",stdin);
    cin>>n>>m;
    while(m--)
    {
        int x,y;
        cin>>x>>y;
        bx[x] = 1;
        by[y] = 1;
    }
    int res = 0;
    for(int i = 2; i < n ; i++)
    {
        if(bx[i] == 0) res++;
        if(by[i] == 0) res++;
    }
    if(n%2 == 1 && bx[n/2+1] == 0 && by[n/2+1] == 0) res--;
    cout<<res<<endl;
    return 0;    
}

 

posted @ 2013-07-28 10:48  Felix_F  阅读(354)  评论(0编辑  收藏  举报