2022年12月16日的训练情况

看完了昨天没看完的 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=0len(数字)1a[len(数字)1i]pow9,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[i1][j],f[i1][j1])+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题:

GCPC总决赛

题目大意:两方有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题:

Ginger的大花环

题目大意:有一个环,上面有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值