20220201模拟赛题解
B2142 求 1+2+3+...+N 的值
就是用高斯公式
#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
cin >> n;
cout << (n+1)*n/2 << endl;
}
B2112 石头剪子布
没有什么好办法就是按照题目模拟即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
string a , b;
cin >> n;
for( int i = 1 ; i <= n ; i ++ )
{
cin >> a >> b;
if( a == b ) printf("Tie\n");
else
{
if( (a == "Rock" && b == "Scissors" ) || (a == "Scissors" && b == "Paper" ) || ( a == "Paper" && b == "Rock" ) ) printf("Player1\n");
else printf("Player2\n");
}
}
}
B2113 输出亲朋字符串
char的相加就是ascall码的相加
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
string s;
cin >> s;
n = s.size();
for( int i = 1 ; i < n ; i ++ )
printf("%c" , s[i] + s[i-1] );
printf("%c\n" , s[n-1] + s[0] );
}
B2117 整理药名
用python内置的函数即可
n = int( input() )
for i in range( 0 , n ):
s = input()
print( s[0:1].upper()+s[1:].lower() )
B2131 甲流病人初筛
模拟
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n , cnt = 0;
string s;
double x;
bool f;
cin >> n;
for( int i = 1 ; i <= n ; i ++ )
{
cin >> s >> x >> f;
if( x >= 37.5 && f )
{
cout << s << "\n";
cnt ++;
}
}
cout << cnt << endl;
}
B2130 简单算术表达式求值
模拟
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 105;
int main()
{
ll a , b;
char op;
cin >> a >> op >> b;
if( op == '+' ) cout << a + b << endl;
else if( op == '-' ) cout << a - b << endl;
else if( op == '*' ) cout << a * b << endl;
else if( op == '/' ) cout << a / b << endl;
else cout << a % b << endl;
}
B2103 图像相似度
遍历一边即可
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n , m , cnt;
bool f[N][N];
int main()
{
cin >> n >> m;
for( int i = 1 ; i <= n ; i ++ )
for( int j = 1 ; j <= m ; j ++ )
cin >> f[i][j];
bool p;
for( int i = 1 ; i <= n ; i ++ )
for( int j = 1 ; j <= m ; j ++ )
{
cin >> p;
if( p == f[i][j] ) cnt ++;
}
printf("%.2lf" , 100.0 * cnt / (n*m) );
}
B2144 阿克曼(Ackmann)函数
记忆化搜索
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 105;
int f[N][N];
int ak( int m , int n )
{
if( f[m][n] ) return f[m][n];
if( m == 0 ) return f[m][n] = n + 1;
if( m > 0 && n == 0 ) return f[m][n] = ak(m-1,1);
return f[m][n] = ak( m-1 , ak(m,n-1) );
}
int main()
{
int n , m;
cin >> n >> m;
cout << ak(n,m) << endl;
}
P3392 涂国旗
枚举分界处即可
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 55;
int r[N] , b[N] , w[N] , cnt , res , ans = N*N;
string s;
int main()
{
int n , m;
cin >> n >> m;
for( int i = 1 ; i <= n ; i ++ )
{
cin >> s;
for( auto it : s )
{
if( it == 'W' ) w[i] ++;
else if( it == 'B' ) b[i] ++;
else r[i] ++;
}
}
for( int i = 1; i < n - 1 ; i ++ )
for( int j = i + 1 ; j < n ; j ++ )
{
cnt = 0;
for( int k = 1 ; k <= i ; k ++ ) cnt += m - w[k];
for( int k = i+1 ; k <= j ; k ++ ) cnt += m - b[k];
for( int k = j+1 ; k <= n ; k ++ ) cnt += m - r[k];
ans = min( ans , cnt );
}
cout << ans << endl;
}
P3692 夏幻的考试
大模拟
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 55;
int t , n , p[N] , ID , cnt;
char type;
string s;
void slove()
{
cin >> s;
type = s[15];
ID = 0;
for( int i = 0 ; i <= 15 ; i ++ ) ID = (ID << 1) + ( s[i] == '1' );
if( ID > 10000 || ID < 1 )
{
printf("Wrong ID\n\n");
for( int i = 0 ; i <= n ; i ++ ) cin >>s;
return ;
}
printf("ID: %d\n" , ID );
cin >> s;
if( s[0] == s[1] ) printf("Type Incorrect\n");
else if( s[1] == type ) printf("Type Correct\n");
else printf("Type Incorrect\n");
cnt = 0;
for( int i = 1 ; i <= n ; i ++ )
{
cin >> s;
bitset<4>ss(s);
if( ss.count() == 1 && s[p[i]] == '1' ) cnt ++;
}
printf("%.1lf\n\n" , 100.0 * cnt / n );
}
int main()
{
cin >> t >> n >> s;
for( int i = 1 ; i <= n ; i ++ ) p[i] = s[i-1] - 'A';
while( t-- ) slove();
}
P2404 自然数的拆分问题
用dfs枚举每一数就行,注意当前的数要大于上一个数
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int n , a[N];
void dfs( int t , int k , int sum )
{
if( sum == n && t > 1 )
{
for( register int i = 1 ; i < t ; i ++ ) printf( "%d+" , a[i] );
printf( "%d\n" , a[t] );
return ;
}
if( sum > n ) return ;
for( register int i = k ; i + sum <= n ; i ++ )
{
a[ t + 1 ] = i;
dfs( t + 1 , i , sum + i );
}
return ;
}
int main()
{
cin >> n;
dfs( 0 , 1 , 0 );
return 0;
}
P2952 [USACO09OPEN]Cow Line S
用双端队列来模拟就行了
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 55;
deque<int> q;
int n;
inline int read()
{
int x = 0 , ch = getchar();
while( ch < '0' || ch > '9' ) ch = getchar();
while( ch >= '0' && ch <= '9' ) x = ( x << 3 ) + ( x << 1 ) + ch - '0' , ch = getchar();
return x;
}
int main()
{
n = read();
char op , f;
for( int i = 1 , x ; n ; n -- )
{
cin >> op >> f;
if( op == 'A' )
{
if( f == 'L') q.push_front(i);
else q.push_back(i);
i ++;
}
else
{
x = read();
if( f == 'L' )
while( x -- ) q.pop_front();
else
while( x -- ) q.pop_back();
}
}
for( auto it : q )
printf("%d\n" , it);
return 0;
}
P1122 最大子树和
从一做根节点,然后遍历一边就好了
#include <bits/stdc++.h>
using namespace std;
const int N = 16005 , INF = 0x7f7f7f7f;
int n , v[N] , head[N] ,f[N] , ans;
vector<int> e[N];
bool vis[N];
inline int read()
{
register int x = 0 , f = 1;
register char ch = getchar();
while( ch < '0' || ch > '9' )
{
if( ch == '-' ) f = -1;
ch = getchar();
}
while( ch >= '0' && ch <= '9' )
{
x = ( x << 3 ) + ( x << 1 ) + ch - '0';
ch = getchar();
}
return x * f;
}
inline void dfs( int x )
{
f[x] = v[x] , vis[x] = 1;
for( register auto it : e[x] )
{
if( vis[it] ) continue;
dfs( it );
f[x] = max( f[x] , f[x] + f[it] );
}
return ;
}
int main()
{
n = read();
for( register int i = 1 ; i <= n ; v[i] = read() , i ++ );
for( register int i = 1 , u , v ; i < n ; i ++ )
{
u = read() , v = read();
e[u].push_back(v) , e[v].push_back(u);
}
dfs( 1 );
ans = -INF;
for( register int i = 1 ; i <= n ; i ++ ) ans = max( ans , f[i] );
cout << ans << endl;
return 0;
}
P2697 宝石串
分别用两个前缀和数组来判断宝石数时候相等,对于长度可以用二分来枚举
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6+5;
int a[N] , b[N];
int n;
string s;
bool check( int x )
{
for( int i = x ; i <= n ; i ++ )
if( (a[i] - a[i-x]) == ( b[i]-b[i-x] ) ) return 1;
return 0;
}
int main()
{
cin >> s;
n = s.size();
for( int i = 1 ; i <= n ; i ++ )
{
a[i] = a[i-1] , b[i] = b[i-1];
if( s[i-1] == 'R' ) a[i]++;
else b[i] ++;
}
int l = 1 , r = min( a[n] , b[n] ) , mid , res = 0;
while( l <= r )
{
mid = ( l + r ) >> 1;
if( check( mid*2 ) ) res = mid , l = mid + 1;
else r = mid - 1;
}
cout << res * 2 << endl;
}
P2781 传教
虽然题目看起来像一个线段树的模版题,但是由于n
很大需要进行离散化
但是因为查询数很少,我们可以把所有添加的区间存起来,当需要查询的时候可以把所有的区间遍历一边,然后找出交集即可
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3+5;
ll a[N] , b[N] , w[N] , cnt ;
ll n , m;
ll sum;
inline int read()
{
int x = 0 , ch = getchar();
while( ch < '0' || ch > '9' ) ch = getchar();
while( ch >= '0' && ch <= '9' ) x = ( x << 3 ) + ( x << 1 ) + ch - '0' , ch = getchar();
return x;
}
int main()
{
n = read() , m = read();
for( ll op , l , r ; m ; m -- )
{
op = read();
if( op == 1 )
cnt ++ , a[cnt] = read() , b[cnt] = read() , w[cnt] = read();
else
{
l = read() , r = read() , sum = 0;
for( int i = 1 ; i <= cnt ; i ++ )
{
if( a[i] > r || b[i] < l ) continue;
sum += ( min( r , b[i] ) - max( l , a[i] ) + 1 ) * w[i];
}
printf("%lld\n" , sum );
}
}
}