现在的位置: 首页 > 综合 > 正文

Cf 102 Div.2

2013年01月30日 ⁄ 综合 ⁄ 共 2992字 ⁄ 字号 评论关闭

A题

我是for循环暴力作的,题解里最牛逼的做法是O(1):

O(1) solution - one may derive it from the previous approach: since x+c = d1 => 2*x + r1 - c1 = d1 => x = (d1+c1-r1)/2
So, you find x, check that it is in [0..9], restore all other numbers as in the previous approach and check that all conditions are met.


B题

简单模拟,注意科学计数 12,345,678.9里面逗号的位置,应该是 ( length - current_pos ) % 3 ==0处打逗号;


C题

给定一个数n表示(A - 1) × (B - 2) × (C - 2) ,要求A*B*C的最大值和最小值。n<=
10^9;

很值得说的一个题,对n<= 10^9,两层for循环x*y*c作为n的3哥因子拆分,保证x<=y<=z,复杂度是 O(
1000*1000 );

注意一个情况就是枚举的x,y,z后来变成(A - 1) × (B - 2) × (C - 2)形式应该是有三种情况。

/*Jan 13, 2012 4:15:42 PM yimao C-Help Farmer GNU C++ Accepted 50ms 1400KB*/
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define MM(a,b) memset(a,b,sizeof(a));
typedef unsigned long long u64;
typedef long long lld;
#define maxn

lld mmax,mmin,n;
void up_max(lld &x,lld y){if(x==-1||x<y)x=y;}
void up_min(lld &x,lld y){if(x==-1||x>y)x=y;}
void work(lld a,lld b,lld c){
    lld t= a*b*c-n;
    up_max( mmax, t );
    up_min( mmin, t );
}
int main()
{
    lld x,y,z;
    while(cin>>n){
        mmax=-1, mmin= -1;
        for(x=1;x<1001;++x){
            if(n%x==0){
                lld k= n/x;
                for(y=x;y*y<=k;++y){
                    if( k%y==0 ){
                        lld z= k/y;
                        // n= x*y*z= (A-1)*(B-2)*(C-2);
                        work( x+1, y+2, z+2 );
                        work( y+1, x+2, z+2 );
                        work( z+1, x+2, y+2 );
                    }    
                }    
            }    
        }    
        cout<<mmin<<" "<<mmax<<endl;
    }    
}


D题

这个题完全不会。

在n*m棋盘上放棋子,要求棋子之间的平方距离不得为5。

下面有个别人写的题解:

提示说这个是骑士巡游的二分图。
我感觉可以这么想。把所有格子看做节点,所有的不能共存的点之间有一条边。
我们的目标就是删掉最少的节点,使这个图中没有连通边。
这明显就是骑士巡游二分图的特点,奇数步与偶数步是不相交的,所以很明显,答案是(m*n+1)>>1
对于小数据需要加特判


E题

n*m(1<=n,m<=9)的棋盘,要求放置T字型,每个T字型是占5个格子,如下4种:

/*  ###    ..#    .#.    #..
    .#.    ###    .#.    ###
    .#.    ..#    ###    #..
*/

问最多可以放多少个,并输出方案,并且不同的T之间用A,B,C...字母区别。


难题,太难不会,直接贴代码。

/*Jan26,2012 1:52:19 PM yimao E-Help Caretaker GNU C++ Accepted 220ms 1400KB*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
#define MM(a,b) memset(a,b,sizeof(a));
typedef unsigned long long u64;
typedef long long lld;
#define maxn 9

/*  ###    ..#    .#.    #..
    .#.    ###    .#.    ###
    .#.    ..#    ###    #..
*/
//choose a point(upper left),then make position of other points follow:
const int shape[4][4][2]= {
    { {0,1},{0,2},{1,1},{2,1} },
    { {1,0},{2,0},{1,-1},{1,-2} },
    { {1,0},{2,0},{2,-1},{2,1} },
    { {1,0},{2,0},{1,1},{1,2} },
};

int m,n; //n row, m column;
struct node{
    char g[maxn][maxn];
    int num,sx,sy;
    node(){
        sx=sy=0;
        MM(g,0);
        num=0;
    }
    void printNode(){
        for(int i=0;i<n;++i){
            for(int j=0;j<m;++j)
                printf("%c",g[i][j]?g[i][j]:'.');
                puts("");
        }
    }
};

stack<node>q;
int ans;
node ansNode;

void bfs(){
    while(1){
        The_end_where_I_begin:
        if( q.empty() ) break;
        node now= q.top();
        q.pop();
        if( now.num>ans ){
            ans= now.num;
            ansNode= now;
        }
        now.num++;
        char ch= 'A'+now.num-1;
        bool flag= 1;
        int i,j,k,l;
        for(i=0;i<n;++i){
            int in=0;
            for(j=0;j<m;++j){
                if( !now.g[i][j] ){
                    flag= 1;
                    for(k=3;k>=0;--k){
                        flag= 1;
                        for(l=0;l<4;++l){
                            int tx= j+ shape[k][l][1];
                            int ty= i+ shape[k][l][0];
                            if( tx<0 || tx>=m || ty<0 ||ty>=n || now.g[ty][tx] ){
                                flag=0;
                                break;
                            }
                        }
                        if( flag ){
                            in++;
                            node tNode= now;
                            tNode.g[i][j]= ch;
                            for(l=0;l<4;++l){
                                int tx= j+ shape[k][l][1];
                                int ty= i+ shape[k][l][0];
                                tNode.g[ty][tx]= ch;
                            }
                            tNode.sx= j+1, tNode.sy= i;
                            q.push( tNode );
                        }
                    }
                    if( in>1 ) goto The_end_where_I_begin;
                }
            }
        }
    }
}

int main()
{
    //freopen("E.txt","r",stdin);
    ans= -1;
    while(cin>>n>>m){
        while(!q.empty()) q.pop();
        q.push( node() );
        bfs();
        printf("%d\n", ans);
        ansNode.printNode();
    }
}

抱歉!评论已关闭.