版权声明:本文为博主原创文章,未经博主允许也可以转载。 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 ;
}
思路:先计算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 ;
}