好久没打蓝桥杯的比赛,回来试试水,就开了第1、2、3一共三个题,第4题可惜了。
 
 
没什么好说的,但是当时比赛刚开始服务器有问题,基本提交的全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 ; 
} 
 
这个题,没啥好特别的想法,我想的是把'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 ; 
} 
 
没啥好说的,存进数组后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 ; 
} 
 
最简单的方法是写两个循环暴力跑,我也是这么做的,但是当时比赛环境可能有问题,一直过不去,比赛完了重新提交就AC了;用map或者onordered_map也可以跑出来,不过当时比赛的时候没想到(其中用unordered_map速度最快,map速度最慢)
# 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 ; 
} 
# 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 ; 
} 
# 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 ; 
} 
 
用堆实现每次取到的都是最小的,但是前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 ; 
} 
 
这个题用二维前缀和加滑动窗口来写最便捷
 
# 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 ( ) ; }  
}