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 ;
}