看完了昨天没看完的 s t l stl stl专题
刷了蓝桥杯的水题:
题目大意:将九进制下的2022转换为十进制下的数
做法:
a
n
s
=
∑
i
=
0
l
e
n
(
数字
)
−
1
a
[
l
e
n
(
数字
)
−
1
−
i
]
∗
p
o
w
(
9
,
i
)
ans=\sum_{i=0}^{len(数字)-1}a[len(数字)-1-i]*pow(9,i)
ans=i=0∑len(数字)−1a[len(数字)−1−i]∗pow(9,i)
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
string s = "2022";
int ans = 0;
for (int i = 0; i < 4; i++) {
ans += pow(9, i)*(s[3 - i] - '0');
}
cout << ans << endl;
}
题目大意:从上往下走,只能选择这个数的左下或者右下走,且向左走的次数与向右走的次数相差不能超过一
做法:根据状态转移方程: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − 1 ] ) + a [ i ] [ j ] f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j] f[i][j]=max(f[i−1][j],f[i−1][j−1])+a[i][j]直接做,注意判断边界。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n;
int f[N][N];
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
cin >> f[i][j];
for (int i = 2; i <= n; i++)
for (int j = 1; j <= i; j++)
f[i][j] += max(f[i - 1][j - 1], f[i - 1][j]);
if (n % 2) cout << f[n][n / 2 + 1] << endl;
else cout << max(f[n][n / 2 + 1], f[n][n / 2]) << endl;
return 0;
}
打了小白月赛63
赛时只做出两道,
赛后准备补出 C , D C,D C,D,
明天补一下 E , F E,F E,F。
A A A题:
题目大意:n个数中选出x个数,全部 & \& &一遍,请问最小为多少
做法:根据 & \& &的性质,按位与后只会变小,所以应该贪心,直接选整个数组。
注意特判
代码如下:
/*
coder:sunshine
school:njupt
*/
#include <bits/stdc++.h>
#define endl '\n' //交互题删掉
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int ans=a[0];
if(n==1)
{
cout<<ans<<endl;
return 0;
}else
{
for(int i=1;i<n;i++)
{
ans=ans&a[i];
}
}
cout<<ans<<endl;
return 0;
}
B B B题:
题目大意:初始伤害值为2点,有m次攻击机会,每次攻击从左往右所有小兵,最后打英雄,如果恰好击杀一个小兵,则伤害+1,问m次后对英雄造成了多少伤害。
做法:模拟遍历就行
代码如下:
/*
coder:sunshine
school:njupt
*/
#include <bits/stdc++.h>
#define endl '\n' //交互题删掉
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N = 8;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
int dmg = 2;
int ans = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
while (m--)
{
for (auto &c : a)
{
if (c - dmg == 0)
{
c -= dmg;
dmg++;
}
else
{
c -= dmg;
}
}
ans += dmg;
}
cout << ans << endl;
return 0;
}
C C C题:
题目大意:两方有n只队,任意挑选 b a t t l e battle battle,获胜条件是哪只的大爹数量多,求平局,胜局,负局数量。
做法:全排列一下,然后循环判断一下
代码如下:
/*
coder:sunshine
school:njupt
*/
#include <bits/stdc++.h>
#define endl '\n' //交互题删掉
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N=5e6+3;
ll n,m,sx,sy,sz,a[N],b[N];
int main()
{
cin>>n;ll p=1,w=0;
for(int i=1;i<=n;i++)p=p*i;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
while(w<p)
{
w++;ll x=0,y=0;
next_permutation(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
if(a[i]>b[i])x++;
if(a[i]<b[i])y++;
}
if(x>y)sx++;
if(x<y)sy++;
if(x==y)sz++;
}
cout<<sx<<" "<<sy<<" "<<sz;
return 0;
}
D D D题:
题目大意:有一个环,上面有n位,有k种花费的颜料给环上色,要求是不能出现连续三次相同的颜色环,求花费最小。
做法:是一道贪心思维题。设花费为 w 1 , w 2 , w 3 , … w_1,w_2,w_3,\ldots w1,w2,w3,…,求花费最小,即以 w 1 , w 1 , w 2 w_1,w_1,w_2 w1,w1,w2的顺序依次上色,到最后要特判一下,如果刚好 % 3 = = 0 \%3==0 %3==0,不需要改动,如果除不尽的话,就要 将一个 w 1 改为 w 2 ,防止出现 w 1 , w 1 , w 1 的组合 将一个w_1改为w_2,防止出现w_1,w_1,w_1的组合 将一个w1改为w2,防止出现w1,w1,w1的组合。
代码如下:
/*
coder:sunshine
school:njupt
*/
#include <bits/stdc++.h>
#define endl '\n' //交互题删掉
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N=5;
int w[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,k;
cin>>n>>k;
for(int i=1;i<=k;i++)
{
cin>>w[i];
}
sort(w+1,w+k+1);
if(k==1)
{
cout<<"Ginger666"<<endl;
}else
{
ll ans=0;
for(int i=1;i<=n;i++)
{
if(i%3) ans+=w[1];
else ans+=w[2];
}
if(n%3)
{
ans-=w[1];
ans+=w[2];
}
cout<<ans<<endl;
}
return 0;
}