首页 > 其他分享 >牛客周赛 Round 40

牛客周赛 Round 40

时间:2024-05-06 18:13:03浏览次数:24  
标签:lv int price cin 40 i64 牛客 using Round

A-小红进地下城

a = input()
b = input()
if a == b : 
    print("Yes")
else:
    print("No")

B-小红打怪

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<string> s(n);
    for (auto &i: s) cin >> i;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++) {
            if (s[i][j] == '.' or s[i][j] == '*') continue;
            int res = 0;
            if (s[i][j] == 'W') {
                for (int x = i, y = j; x >= 0; x--)
                    res += s[x][y] == '*';
            } else if (s[i][j] == 'S') {
                for (int x = i, y = j; x < n; x++)
                    res += s[x][y] == '*';
            } else if (s[i][j] == 'A') {
                for (int x = i, y = j; y >= 0; y--)
                    res += s[x][y] == '*';
            } else {
                for (int x = i, y = j; y < m; y++)
                    res += s[x][y] == '*';
            }
            cout << res << "\n";
            return 0;
        }
    return 0;
}

C-小红的排列构造

每种数字出现的次数不能超过两次

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = int64_t;


using vi = vector<i64>;
using pii = pair<i64, i64>;

const i64 inf = 1e18;
const i64 mod = 1e9 + 7;
#define int i64


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n;
    cin >> n;
    vi p(n), q(n), vp(n + 1), vq(n + 1);
    for (int i = 0, x; i < n; i++) {
        cin >> x;
        if (vp[x] == 0) {
            vp[x] = 1, p[i] = x;
        } else if (vq[x] == 0) {
            vq[x] = 1, q[i] = x;
        } else {
            cout << "-1\n";
            return 0;
        }
    }
    for (int i = 0, j = 1; i < n; i++) {
        while (vp[j] == 1) j++;
        if (p[i] == 0) p[i] = j, vp[j] = 1;
    }
    for (int i = 0, j = 1; i < n; i++) {
        while (vq[j] == 1) j++;
        if (q[i] == 0) q[i] = j, vq[j] = 1;
    }
    for (auto i: p) cout << i << " ";
    cout << "\n";
    for (auto i: q) cout << i << " ";
    cout << "\n";
    return 0;
}

D-小红升装备

首先最简单想法肯定是枚举一下这个武器生了多少级,然后进行转移

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = int64_t;


using vi = vector<i64>;
using pii = pair<i64, i64>;

const i64 inf = 1e18;
const i64 mod = 1e9 + 7;
#define int i64


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    vi f(m + 1);
    for (int i = 1, att, price, cost, upgrade, lv; i <= n; i++) {
        cin >> att >> price >> cost >> upgrade >> lv;
        vi g = f;
        for (int j = lv, v = price + lv * cost, w = att + lv * upgrade; j >= 0; j--, v -= cost, w -= upgrade) {
            for (int k = m; k >= v; k--)
                g[k] = max(g[k], f[k - v] + w);
        }
        f = move(g);
    }
    cout << *max_element(f.begin(), f.end()) << "\n";
    return 0;
}

这个做个会TLE,当实际上我们发现\(m\)的范围很小,所以我们可以限制一下枚举的范围。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = int64_t;


using vi = vector<i64>;
using pii = pair<i64, i64>;

const i64 inf = 1e18;
const i64 mod = 1e9 + 7;
#define int i64


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    vi f(m + 1);
    for (int i = 1, att, price, cost, upgrade, lv; i <= n; i++) {
        cin >> att >> price >> cost >> upgrade >> lv;
        if (price > m) continue;
        vi g = f;
        for (int j = min(lv, (m - price) / cost), v = price + j * cost, w = att + j * upgrade; j >= 0; j--, v -= cost, w -= upgrade) {
            for (int k = m; k >= v; k--)
                g[k] = max(g[k], f[k - v] + w);
        }
        f = move(g);
    }
    cout << *max_element(f.begin(), f.end()) << "\n";
    return 0;
}

这个做法是可以通过的,复杂度是\(O(nx^2)\)

但实际上,购买物品可以当作是01背包、升级的部分可以当作多重背包,但是多重背包必须有01背包的依赖。所以我们可以先01背包,且强制选择,然后用二进制优化多重背包部分。复杂度是\(O(nx\log lvmax)\)

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;


using vi = vector<i64>;
using pii = pair<i64, i64>;

const i64 inf = 1e18;
const i64 mod = 1e9 + 7;

#define int long long


i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    vi f(m + 1);
    for (int i = 1, att, price, cost, upgrade, lv; i <= n; i++) {
        cin >> att >> price >> cost >> upgrade >> lv;
        vi g(m + 1);
        for (int j = m; j >= price; j--)
            g[j] = f[j - price] + att;
        vector<pii> a;
        for (int j = 1; lv > 0; j *= 2) {
            if (j <= lv)
                a.emplace_back(cost * j, upgrade * j), lv -= j;
            else
                a.emplace_back(cost * lv, upgrade * lv), lv = 0;
        }
        for (const auto &[v, w]: a)
            for (int j = m; j >= v + price; j--)
                g[j] = max(g[j], g[j - v] + w);
        for (int j = 0; j <= m; j++)
            f[j] = max(f[j], g[j]);
    }
    cout << *max_element(f.begin(), f.end()) << "\n";
    return 0;
}

E-小红的矩阵划分

有一个小结论是,如果\(n\)是3 的倍数,则只用L或只用正方形都可以填满,反之用L的一定可以只剩一个空格子。

所以当\(n\)是 3 的倍数时,考虑两种方案哪一个填满更优。

否则用L形尽可能填满,将最后一个没填满和L替换为一个正方形,用正方形填满。三种方式取最优解即可。

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main(){
	i64 n, x, y;
	cin >> n >> x >> y;
	if(n % 3 == 0) cout << max(n * n / 3 * x, n * n / 4 * y);
	else cout << max({n * n / 3 * x, n * n / 3 * x - x + y, n * n / 4 * y});
	return 0;
}

标签:lv,int,price,cin,40,i64,牛客,using,Round
From: https://www.cnblogs.com/PHarr/p/18175559

相关文章

  • 牛客小白月赛91
    A-Bingbong的化学世界#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1001;inta[maxn];intmain(){stringt="...|...";vector<string>x(6);for(auto&i:x)cin>>i;if(x.front()==t){......
  • APS54087 是 一款外围电路简单的无频闪降压LED恒流驱动器
     APS54087是一款外围电路简单的无频闪降压LED恒流驱动器,芯片采用高压工艺,减少整个电路的发热量,提高效率。适用于6.5-80V电压范围的非隔离式大功率恒流LED驱动领域。LD端口支持模拟调光,调光范围0-1.8V,应用于大电流设置。LD端口接电容到地,可以设置软起动时间。 APS54087......
  • 40.Vue UI组件简单整理
    以下版本:ElementPlus组件库首先基于Vue3的PC端开源UI组件库安装依赖yarnaddelement-plus@2.2.19--savemain.js中导入并挂载模块importElementPlusfrom'element-plus'import'element-plus/dist/index.css'app.use(ElementPlus)app.mount('#app')注意注意这......
  • 《自动机理论、语言和计算导论》阅读笔记:p402-p427
    《自动机理论、语言和计算导论》学习第13天,p402-P427总结,总计26页。一、技术总结无。二、英语总结1.eludee--,assimilatedformofex-(out,away)+ludere(toplay,seeludicrous)。vt.ifsthyouwanteludesyou,youdonotsucceedinachievingit。p426,Mor......
  • ABC240Ex Sequence of Substrings
    ABC240ExSequenceofSubstringsLIS的好题改编。约定\(S(l,r)\)为字符串\(s\)中第\(l\)位到底\(r\)​位。\(S(l,r)<S(x,y)\)为字符串中\([l,r]\)的子串字典序比\([x,y]\)的子串小。前置LIS的\(n\logn\)求法。题解我们考虑按照类似于朴素LIS的方式设状......
  • 试了下playground-续8
    第七阵,PHOTOMOSAICS,就是马赛克,代码还没仔细看,想想这个原理其实很简单,就是把固定方格区域的色块模糊化就可以了,当难不住浑水摸久了的我,事实是,大体上走流程可以,但一些小细节给困住了,甚至到了要寻求外助的窘境,就在一个小时前才排查出故障点所在,运气啊,能再坚持一下就解救是有前提的,那......
  • 2024牛客五一集训-1
    CoffeeChicken基本思路:f[i]表示s[i]的字符串长度即f[i]=f[i-2]+f[i]solve(n,k)表示s[n]中第k个字符当n<=2时,直接返回答案当n>2时,k>f[i-2]时solve(n-1,k-f[n-2]);说明要找的字符在前一天中,也就是不在前两天的数据范围之内,因此直......
  • 【牛客】美团2024年春招第一场笔试【技术】
    【牛客】美团2024年春招第一场笔试【技术】1.小美的平衡矩阵#include<iostream>#include<vector>usingnamespacestd;intmain(){intn;cin>>n;vector<vector<int>>nums;for(inti=0;i<n;i++){fgetc(stdin);......
  • 20240504 —— Goodbye 2024(1/3).
    很久没有用心写过随笔了。写随笔对我来说是个很困难的事情,因为我文笔烂完了。每次都是写前觉得有一堆东西可以写,写的时候就不知道咋连结在一起,最后乱写了一堆发出来。2024/5/422:39看了会物理书后累了打了会块(TETR.IO),3:5,DEFEAT。怎么回事呢。打完前两局感觉对手硬实力不是......
  • 牛客小白月赛92 题解
    牛客小白月赛92题解A.获得木头签到\((x\times4)/2\times4=x\times8\)#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#defineendl'\n'#definedebug(x......