Codeforces Round #483 (Div. 2) A 模拟B暴搜 C数论 D dp

版权声明:本文为博主原创文章,未经博主允许也可以转载。 https://blog.csdn.net/FrankAx/article/details/83019974

A
思路:输出中间的数
Code:

#include <bits/stdc++.h>
using namespace std;
const int AX = 1e3 + 666 ;
int a[AX];
int main(){
	int n ;
	cin >> n ;
	for( int i = 1 ; i <= n ; i++ ){
		cin >> a[i] ; 
	}
	sort( a + 1 , a + n + 1 ) ; 
	if( n % 2 ) n ++ ; 
	cout << a[n/2] << endl;
	return 0 ; 
}

B
思路:暴搜下
Code:

#include <bits/stdc++.h>
using namespace std;
const int AX = 1e2 + 66 ;
char G[AX][AX];
int dir[8][2] = {
	{1,0},
	{0,1},
	{-1,0},
	{0,-1},
	{1,1},
	{1,-1},
	{-1,1},
	{-1,-1}
};
bool check( int x , int y , int z ){
	int ans = 0 ; 
	for( int i = 0 ; i < 8 ; i ++ ){
		int xx = x + dir[i][0] ;
		int yy = y + dir[i][1] ;
		if( G[xx][yy] == '*' ){
			ans ++ ; 
		}
	}
	return ( ans == z ) ;
}
int main(){
	int n , m ;
	cin >> n >> m ;
	for( int i = 0 ; i < n ; i++ ){
		cin >> G[i] ; 
	}	
	int z ;
	for( int i = 0 ; i < n ; i++ ){
		for( int j = 0 ; j < m ; j++ ){
			if( G[i][j] == '*' ) continue; 
			if( G[i][j] >= '0' && G[i][j] <= '8' ){
				z = G[i][j] - '0';
			}
			if( G[i][j] == '.' ){
				z = 0 ;
			}
			if( !check(i,j,z) ){
				return 0*printf("NO\n");
			}
		}
	}
	cout << "YES" << endl;
	return 0 ; 
}

C
题意:p/q在b进制下是否是有限小数。
思路:根据b进制小数位转化十进制小数的方式:1/b , 1 / bb , 1/ bb*b,…
可得,q与b有相同因子时为有限小数

#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL p , q , b ;
LL gcd( LL a,  LL b ){
	return !b ? a : gcd( b , a % b ) ;
}
int main(){
	int n ;
	scanf("%d",&n);
	while( n-- ){
		scanf("%I64d%I64d%I64d",&p,&q,&b);
		if( !p || q == 1 || p == q || p % q == 0 ) { printf("Finite\n"); continue;}
		q /= gcd( q , p ) ;
		b = gcd( q , b ) ;
		while( b != 1 && q != 1 ){
			b = gcd( q , b ) ;
			q /= b ;
		}
		if( q == 1 ) printf("Finite\n");
		else printf("Infinite\n");
	}
	return 0 ; 
}

D

思路:先计算dp[i][j]为对应位置的值(每次计算少一个,类似于杨辉三角)
然后dp[i][j]为长度i开始位置j的最大抑或值。
Code:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int AX = 5e3 + 66 ;
LL dp[AX][AX];
LL a[AX];
int main(){
	int n ;
	ios_base::sync_with_stdio(false); cin.tie(0);
	cin >> n ; 
	for( int i = 1 ; i <= n ; i++ ){
		cin >> dp[1][i] ;
	}
	for( int i = 2 ; i <= n ; i++ ){
		for( int j = 1 ; j <= n - i + 1 ; j++ ){
			dp[i][j] = dp[i-1][j] ^ dp[i-1][j+1] ;
		}
	}
	for( int i = 2 ; i <= n ; i ++ ){
		for( int j = 1 ; j <= n ; j++ ){
			dp[i][j] = max( dp[i][j] , max( dp[i-1][j] , dp[i-1][j+1] ) ) ;
		}
	}
	int m ;
	cin >> m ; 
	int l , r ;
	while( m -- ){
		cin >> l >> r ; 
		r = r - l + 1 ;
		cout << dp[r][l] << endl;
	}
	return 0 ; 
}

猜你喜欢

转载自blog.csdn.net/FrankAx/article/details/83019974