2023牛客寒假算法基础集训营4

A 清楚姐姐学信息论

大概意思就是问a的b次和b的a次谁大,所以只需要一些数学运算即可分类讨论出结果

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
void solve()
{
    int a, b;
    cin >> a >> b;
    if (a > b) swap(a, b);
    if (a == b)
    {
        cout << a << endl;
        return;
    }
    if (a > b && b >= 3)
    {
        cout << b << endl;
    }
    else if (b > a && a >= 3)
    {
        cout << a << endl;
    }
    else
    {
        if (a == 2)
        {
            if (b == 3) puts("3");
            else if (b == 4) puts("2");
            else puts("2");
        }
    }
}
signed main()
{
    solve();
}

B清楚姐姐学构造

用题给三个式子互相推一推,已知C所以可以先得到A再通过得到的A推出B,最后从前往后遍历一遍判断三个式子互相满不满足,不满足输出NO

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N];
int qmi(int a, int b, int p)
{
    int res = 1 % p;
    while (b)
    {
        if (b & 1) res = res * a % p;
        b >>= 1;
        a = a * a % p;
    }
    return res;
}
void solve()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> c[i];
    for (int i = 1; i <= (n + 1) / 2; i++)
    {

        a[i] = (c[i] + c[n - i + 1]) * qmi(2, m - 2, m) % m;
        a[n - i + 1] = a[i];
        b[i]=(c[i]-a[i]+m)%m;
        b[n-i+1]=(c[n-i+1]-a[i]+m)%m;
    }
    
    for (int i = 1; i <= (n + 1) / 2; i++)
    {
        if (((b[i] + b[n - i + 1]) % m) != 0)
        {
            puts("no");
            return;
        }
        if (a[i] != a[n - i + 1])
        {
            puts("no");
            return;
        }
        if ((a[i] + b[i]) % m != c[i] % m)
        {
            puts("No");
            return;
        }
    }
        puts("yes");
    for (int i = 1; i <= n; i++) cout << a[i] << " ";
    puts("");
    for (int i = 1; i <= n; i++) cout << b[i] << " ";
    puts("");

}
signed main()
{
    solve();
}

C清楚姐姐学01 背包(easy)

三层循环

第一层遍历取走的点,后两层遍历01背包,最后跑完01背包后判断一下不取这个点和取这个点的差值,满足条件输出0不然输出差值+1。

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 110;
int dp[N];
int v[N], w[N];
void solve()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> w[i] >> v[i];
    for (int k = 1; k <= n; k++)
    {
        memset(dp,0,sizeof dp);
        for (int i = 1; i <= n; i++)
        {
            if (i == k) continue;
            for (int j = m; j>=w[i]; j--)
            {
                dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
            }
            
        }
        if (dp[m - w[k]] + v[k] > dp[m]) puts("0");
        else
        {
            cout << dp[m] - dp[m - w[k]] - v[k] + 1 << endl;
        }
    }
}
signed main()
{
    solve();
}

E清楚姐姐打怪升级

讨论攻击次数,最后一起算时间。

把hp分成两部分,直接伤害和真实伤害,直接伤害就是打一下打出的伤害

真实伤害就是算上回复后的伤害即(直接伤害减去回复量)

照着这个思路去模拟,如果直接伤害可以直接打死,算攻击一次,不能去算真实伤害,如果真实伤害为负就是打不死。

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int hp[N], hui[N];
void solve()
{
    int n, t, attack;
    int ans = 0;
    cin >> n >> t >> attack;
    for (int i = 1; i <= n; i++)
    {
        cin >> hp[i] >> hui[i];
    }
    for (int i = 1; i <= n; i++)
    {
        
        hui[i] *= t;
        if (hp[i] - attack <= 0)
        {
            ans++;
            continue;
        }
        else
        {
            ans++;
            hp[i] -= attack;
            int realattack = attack - hui[i];
            if (realattack <= 0)
            {
                puts("-1");
                return;
            }
            else
            {
                ans += hp[i] / realattack;
                if (hp[i] % realattack) ans++;
            }
        }
    }
    ans--;
    ans = ans * t + 1;
    cout << ans << endl;
    return;
}
signed main()
{
    solve();
}

L清楚姐姐的三角形一

数学题

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;


void solve()
{
    int a, b, c;
    cin >> a >> b >> c;
    int sum = a + b + c;
    if (sum % 2)
    {
        puts("No");
        return;
    }
    else
    {
        sum /= 2;
        a = sum - a;
        b = sum - b;
        c = sum - c;
        if (a + b > c && a + c > b && b + c > a)
        {
            puts("Yes");
            cout << a << " " << b << ' ' << c << endl;
        }
        else puts("No");
    }
}
signed main()
{
    int t;
    cin >> t;
    while (t--) solve();
}

M清楚姐姐的三角形二

三个数周期性构造即可

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 1e5 + 10;

int arr[N];
void solve()
{
    arr[1] = 1;
    arr[2] = 2;
    arr[3] = 1;
    for (int i = 4; i <= N; i++)
    {
        arr[i] = arr[i - 3];
    }
    int n;
    cin >> n;
    for (int i =1; i <= n; i++) cout << arr[i] << " ";
    puts("");
    

}
signed main()
{
    solve();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值