题目列表
说明
好久没打蓝桥杯的比赛,回来试试水,就开了第1、2、3一共三个题,第4题可惜了。
1.thanks,mom【算法赛】
思路:
没什么好说的,但是当时比赛刚开始服务器有问题,基本提交的全WA了。
# include <bits/stdc++.h>
# define endl '\n'
# define int long long
using namespace std;
using ull = unsigned long long ;
const int N = 1e5 + 5 , mod = 1e9 + 7 , INF = 0x3f3f3f3f ;
void solve ( ) {
cout << "thanks,mom" ;
}
signed main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
int T = 1 ;
while ( T-- ) {
solve ( ) ;
}
return 0 ;
}
2.霓虹【算法赛】
说明
这个题,没啥好特别的想法,我想的是把'0'到'9'的每一笔画是否出现置成0和1(有该笔画为1,否则为0),然后遍历两个字符串比较。
参考代码
# include <bits/stdc++.h>
# define endl '\n'
using namespace std;
using ll = long long ;
using ull = unsigned long long ;
const int N = 1e5 + 5 , mod = 1e9 + 7 , INF = 0x3f3f3f3f ;
int cnt[ 10 ] [ 7 ] = { { 1 , 1 , 1 , 0 , 1 , 1 , 1 } , { 0 , 0 , 1 , 0 , 0 , 1 , 0 } , { 1 , 0 , 1 , 1 , 1 , 0 , 1 } ,
{ 1 , 0 , 1 , 1 , 0 , 1 , 1 } , { 0 , 1 , 1 , 1 , 0 , 1 , 0 } , { 1 , 1 , 0 , 1 , 0 , 1 , 1 } , { 1 , 1 , 0 , 1 , 1 , 1 , 1 } ,
{ 1 , 0 , 1 , 0 , 0 , 1 , 0 } , { 1 , 1 , 1 , 1 , 1 , 1 , 1 } , { 1 , 1 , 1 , 1 , 0 , 1 , 1 } } ;
void solve ( ) {
string s1, s2;
cin >> s1 >> s2;
int ans = 0 ;
for ( int i = 0 ; i< s1. size ( ) ; i++ ) {
char c1= s1[ i] , c2= s2[ i] ;
if ( c1== c2) continue ;
else {
for ( int j = 0 ; j< 7 ; j++ ) {
if ( cnt[ c1- '0' ] [ j] != cnt[ c2- '0' ] [ j] ) ans++ ;
}
}
}
cout << ans << endl;
}
int main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
int T = 1 ;
while ( T-- ) {
solve ( ) ;
}
return 0 ;
}
3. 奇偶排序【算法赛】
思路
没啥好说的,存进数组后sort()一下,自己写一个cmp()比较函数即可
参考题解
# include <bits/stdc++.h>
# define endl '\n'
using namespace std;
using ll = long long ;
using ull = unsigned long long ;
const int N = 1e3 + 5 , mod = 1e9 + 7 , INF = 0x3f3f3f3f ;
int a[ N] ;
int n;
bool cmp ( int a1, int a2) {
if ( a1% 2 == 1 && a2% 2 == 1 ) return a1< a2;
else if ( a1% 2 == 0 && a2% 2 == 0 ) return a1< a2;
else if ( a1% 2 == 0 && a2% 2 == 1 ) return false ;
else if ( a1% 2 == 1 && a2% 2 == 0 ) return true ;
}
void solve ( ) {
cin >> n;
for ( int i = 0 ; i< n; i++ ) cin >> a[ i] ;
sort ( a, a+ n, cmp) ;
for ( int i = 0 ; i< n; i++ ) cout << a[ i] << " \n" [ i== n- 1 ] ;
}
int main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
int T = 1 ;
while ( T-- ) {
solve ( ) ;
}
return 0 ;
}
4. 可结合的元素对【算法赛】
说明
最简单的方法是写两个循环暴力跑,我也是这么做的,但是当时比赛环境可能有问题,一直过不去,比赛完了重新提交就AC了;用map或者onordered_map也可以跑出来,不过当时比赛的时候没想到(其中用unordered_map速度最快,map速度最慢)
参考题解1
# include <bits/stdc++.h>
# define endl '\n'
# define int long long
using namespace std;
const int N = 1e5 + 5 ;
int n;
int a[ N] ;
int lowbit ( int x) { return x& ( - x) ; }
signed main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
cin >> n;
for ( int i = 1 ; i<= n; i++ ) cin >> a[ i] ;
int ans = 0 ;
for ( int i = 1 ; i<= n; i++ ) {
for ( int j = i+ 1 ; j<= n; j++ ) {
if ( lowbit ( a[ i] + a[ j] ) == a[ i] + a[ j] ) ans++ ;
}
}
cout << ans;
return 0 ;
}
参考题解2
# include <bits/stdc++.h>
# define endl '\n'
using namespace std;
using ll = long long ;
using ull = unsigned long long ;
const int N = 1e5 + 5 , mod = 1e9 + 7 , INF = 0x3f3f3f3f ;
map< ll, ll> mp;
void solve ( ) {
int n; cin >> n;
ll ans = 0 ;
for ( int i = 1 ; i<= n; i++ ) {
ll x; cin >> x;
for ( int j = 0 ; j< 32 ; j++ ) {
ll y = 1LL << j;
ans+= mp[ y- x] ;
}
mp[ x] ++ ;
}
cout << ans;
}
int main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
int T = 1 ;
while ( T-- ) {
solve ( ) ;
}
return 0 ;
}
参考题解3
# include <bits/stdc++.h>
# define endl '\n'
using namespace std;
using ll = long long ;
using ull = unsigned long long ;
const int N = 1e5 + 5 , mod = 1e9 + 7 , INF = 0x3f3f3f3f ;
unordered_map< ll, ll> mp;
void solve ( ) {
int n; cin >> n;
ll ans = 0 ;
for ( int i = 1 ; i<= n; i++ ) {
ll x; cin >> x;
for ( int j = 0 ; j< 32 ; j++ ) {
ll y = 1LL << j;
ans+= mp[ y- x] ;
}
mp[ x] ++ ;
}
cout << ans;
}
int main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
int T = 1 ;
while ( T-- ) {
solve ( ) ;
}
return 0 ;
}
5. 兽之泪【算法赛】
思路
用堆实现每次取到的都是最小的,但是前k-1个要考虑是否是第一次打败的问题,以及考虑是否要打第k个怪物的问题
参考题解
# include <bits/stdc++.h>
# define endl '\n'
# define int long long
using namespace std;
using PII = pair< int , int > ;
const int N = 2e5 + 5 ;
int k, n;
PII a[ N] ;
priority_queue< PII, vector< PII> , greater< PII> > heap1;
signed main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
cin >> k >> n;
for ( int i = 1 ; i<= k; i++ ) {
int x, y; cin >> x >> y;
a[ i] = { x, y} ;
}
for ( int i = 1 ; i<= k- 1 ; i++ ) {
PII t1 = { a[ i] . first, i} ;
heap1. push ( t1) ;
}
int ans1 = 0 ;
for ( int i = 1 ; i<= n; i++ ) {
auto t= heap1. top ( ) ;
ans1+= t. first;
if ( t. second!= - 1 ) {
heap1. pop ( ) ;
PII t1 = { a[ t. second] . second, - 1LL } ;
heap1. push ( t1) ;
}
}
int ans2 = 0 ;
priority_queue< PII, vector< PII> , greater< PII> > heap2;
for ( int i = 1 ; i<= k; i++ ) {
ans2+= a[ i] . first;
heap2. push ( { a[ i] . second, - 1LL } ) ;
n-- ;
}
for ( int i = 1 ; i<= n; i++ ) {
auto t1 = heap2. top ( ) ;
ans2+= t1. first;
}
cout << min ( ans1, ans2) ;
return 0 ;
}
6. 矩阵X【算法赛】
说明
这个题用二维前缀和加滑动窗口来写最便捷
参考题解(从大佬那copy来的)
# include <bits/stdc++.h>
using namespace std;
# define int long long
# define ll long long
# define pp pair< int , int >
const int N= 1e6 + 10 ;
const int M= ( 1ll << 31 ) - 1 ;
int n, m, x, y, k, z, o;
const int mo= 1e9 + 7 ;
struct w {
int x, y;
} a[ N] ;
void sovel ( )
{
cin>> n>> m>> k>> o;
vector< vector< int > > v ( n+ 1 , vector < int > ( m+ 1 ) ) ;
vector< vector< int > > sum ( n+ 1 , vector < int > ( m+ 1 ) ) ;
vector< vector< int > > dpa ( n+ 1 , vector < int > ( m+ 1 ) ) ;
vector< vector< int > > dpb ( n+ 1 , vector < int > ( m+ 1 ) ) ;
auto getsum= [ & ] ( int x, int y) {
if ( x< k|| y< o)
{
return 0ll ;
}
return sum[ x] [ y] - sum[ x- k] [ y] - sum[ x] [ y- o] + sum[ x- k] [ y- o] ;
} ;
for ( int i= 1 ; i<= n; i++ )
{
for ( int j= 1 ; j<= m; j++ )
{
cin>> v[ i] [ j] ;
sum[ i] [ j] = sum[ i- 1 ] [ j] + sum[ i] [ j- 1 ] - sum[ i- 1 ] [ j- 1 ] + v[ i] [ j] ;
}
}
for ( int j= 1 ; j<= m; j++ )
{
int l= 0 , r= - 1 ;
for ( int i= 1 ; i<= n; i++ )
{
x= v[ i] [ j] ;
while ( l<= r&& a[ r] . x<= x)
{
r-- ;
}
r++ ;
a[ r] = { x, i} ;
while ( i- a[ l] . y+ 1 > k)
{
l++ ;
}
dpa[ i] [ j] = a[ l] . x;
}
}
for ( int i= k; i<= n; i++ )
{
int l= 0 , r= - 1 ;
for ( int j= 1 ; j<= m; j++ )
{
x= dpa[ i] [ j] ;
while ( l<= r&& a[ r] . x<= x)
{
r-- ;
}
r++ ;
a[ r] = { x, j} ;
while ( j- a[ l] . y+ 1 > o)
{
l++ ;
}
dpb[ i] [ j] = a[ l] . x;
}
}
int manx= 0 ;
for ( int j= 1 ; j<= m; j++ )
{
int l= 0 , r= - 1 ;
for ( int i= 1 ; i<= n; i++ )
{
x= - v[ i] [ j] ;
while ( l<= r&& a[ r] . x<= x)
{
r-- ;
}
r++ ;
a[ r] = { x, i} ;
while ( i- a[ l] . y+ 1 > k)
{
l++ ;
}
dpa[ i] [ j] = a[ l] . x;
}
}
for ( int i= k; i<= n; i++ )
{
int l= 0 , r= - 1 ;
for ( int j= 1 ; j<= m; j++ )
{
x= dpa[ i] [ j] ;
while ( l<= r&& a[ r] . x<= x)
{
r-- ;
}
r++ ;
a[ r] = { x, j} ;
while ( j- a[ l] . y+ 1 > o)
{
l++ ;
}
manx= max ( manx, ( dpb[ i] [ j] + a[ l] . x) * getsum ( i, j) ) ;
}
}
cout<< manx;
}
signed main ( )
{
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
int t= 1 ;
while ( t-- )
{
sovel ( ) ;
}
}