8.3 训练赛补题 B思维 C方格填数(搜索) E枚举,精度

33 篇文章 0 订阅
18 篇文章 0 订阅

B
思路:相当于转化成b进制。
Code:

#include <bits/stdc++.h>
#define LL unsigned long long 
using namespace std;

int main(){
    int T;
    cin >> T;
    LL K , b ,n ;
    while( T-- ){
        cin >> K >> b >> n ;
        LL res = 0LL;
        while( n ){
            int tmp = n % b ;
            n /= b;
            res += tmp * tmp ;
        }
        cout << K << ' ' << res << endl;
    }

    return 0 ; 
}

C
题意:给一个RxC的网格,有的格子里面有数,其余待填,给网格划分几个区域,每个区域大小n只能填1-n的组合且不能重复,8个方向不能重复。
思路:dfs搜索
Code:

#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const int AX = 100+6;
int G[AX][AX];
int reg[AX][AX];
int num[AX];
int vis[AX][AX];
int falg ; 
int K ;
int dir[8][2] = {
    { 1 , 0 },
    { 0 , 1 },
    { -1 ,0 },
    { 0 , -1},
    { 1 , 1 },
    { 1, -1 },
    { -1, 1 },
    { -1 , -1 } 
};
int  r , c ;

bool check( int x , int y , int val ){
    for( int i = 0 ; i < 8 ; i++ ){
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];
        if( xx >= 0 && xx < r && yy >= 0 && yy < c && G[xx][yy] == val ) return false;
    }
    return true;
}

void dfs( int x , int y ){
    if( falg ) return ;
    if( x == r && y == 0 ){
        falg = 1 ; 
        cout << K << endl;
        for( int i = 0 ; i < r ; i++ ){
            for( int j = 0 ; j < c ; j++ ){
                printf("%d%c",G[i][j]," \n"[j==c-1]);
            }
        }
        return ; 
    }
    if( y >= c ) dfs( x + 1 , 0 );
    else{
        if( G[x][y] ) dfs( x , y + 1 );
        else{
            int tmp = reg[x][y];
            for( int i = 1 ; i <= num[tmp] ; i++ ){ 
                if( !vis[tmp][i] && check( x , y , i ) ){
                    G[x][y] = i;
                    vis[tmp][i] = 1 ;
                    dfs( x , y + 1 );
                    G[x][y] = 0;
                    vis[tmp][i] = 0 ;
                }
            }
        }
    }
}

int main(){
    int T;
    scanf("%d",&T);
    char op[50]; 
    while( T-- ){
        falg = 0 ;
        memset( reg , 0 , sizeof(reg) );
        memset( G , 0 , sizeof(G) );
        memset( vis , 0 , sizeof(vis) );
        memset( num , 0 , sizeof(num) );
        int x , y ;
        scanf("%d%d%d",&K,&r,&c);
        for( int i = 0 ; i < r ; i++ ){
            for( int j = 0 ; j < c; j++ ){
                scanf("%s",op);
                if( op[0] != '-' ){
                    sscanf(op,"%d",&x);
                    G[i][j] = x;
                }else G[i][j] = 0 ;
            }
        }
        int n , m ;
        scanf("%d",&n);
        char str[10]; 
        for( int i = 1 ; i <= n ; i++ ){
            scanf("%d",&m);
            for( int j = 0 ; j < m ;j ++ ){
                scanf("%s",str);
                sscanf(str,"(%d,%d)",&x,&y);
                x-- ; y -- ;
                if( G[x][y] ) vis[i][G[x][y]] = 1 ;
                reg[x][y] = i ;
            }
            num[i] = m ; 
        }
        dfs( 0 , 0 );
    }
    return 0 ; 
}

E
题意:给一个分母最大值m,和一个小数x,求分母不大于m的分数最接近x的值。
思路:枚举m找出相差最小的分子。
Code:

#include <bits/stdc++.h>
#define eps 1e-9
using namespace std;
int main(){
    int T;
    scanf("%d",&T);
    int K ,b ;
    double x;
    while( T-- ){
        int res_a , res_b ;
        double res = 2.0 ;
        int a ;
        scanf("%d%d%lf",&K,&b,&x);
        for( int i = b ; i >= b / 2 ; i-- ){
            a = (int)((double)(i * x) + 0.5);
            double tmp = (double)((double)a / (double)i) ;
            if( fabs( tmp - x ) < res ){
                res = fabs(tmp - x) ;
                res_a = a ;
                res_b = i ;
            }
        }
        int d = __gcd(res_a,res_b);
        printf("%d %d/%d\n",K,res_a/d,res_b/d);
    }
    return 0 ; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值