牛客周赛 Round 39(补题)

devtools/2024/9/22 16:08:46/

小红不想做完全背包 (hard)

题目描述

本题和easy版本的唯一区别是:ppp没有必须等于3的限制。

完全背包是一个经典问题,但小红完全不会完全背包,因此她不想做完全背包。

现在小红拿到了一个长的很像完全背包的题,她希望你帮她解决一下。
 

给定一个背包,有nnn种物品,每种物品的价值为aia_iai​,有无穷多个。小红有一个无穷大的背包,她希望往里面放若干个物品,使得最终所有物品的价值之和为ppp的倍数。小红想知道最终至少要放多少物品?

(注意:不能不放物品)

示例1

输入

复制4 3 1 2 3 4

4 3
1 2 3 4

输出

1

1

错误操作:

我的思路就正确,操作就是在我每次输入都没有存在一个数组中在进行处理。这导致有些没有遍历到或者其前面那个数据的最小值发生改变。导致答案错误。

思路:

我们用dp求最小到m值得操作数。

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define endl "\n"
#define N 2000
void solve()
{int i,j,k,n,m,t,a[N+50],f[N+50];cin>>n>>m;memset(f,1,sizeof(f));for(i=1;i<=n;i++){cin>>a[i]; a[i]%=m; f[a[i]]=1;}//cout << f[0] <<endl;for(i=1;i<=n;i++){for(j=0;j<m;j++){f[(j+a[i])%m]=min(f[(j+a[i])%m],f[j]+1);}}cout<<f[0];}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;
//	cin>>t;0while(t--){solve();} return 0;
} 

红不想做莫比乌斯反演杜教筛求因子和的前缀和

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

小红来到了一家蛋糕店,蛋糕店中售卖了若干种不同的长方体蛋糕,具体来讲,蛋糕店中售卖若干种形状为横向长度不大于nnn,纵向长度不大于mmm,高度不大于ppp个单位的蛋糕。每个蛋糕的表面要裹上奶油,也就是说,除了底面以外,其余5个面都需要裹奶油。我们不妨定义:奶油消耗量为暴露在空气中的5个面的面积之和。


我们定义两种蛋糕是不同的,当且仅当两个蛋糕的横向或者纵向长度或高度不同。即分别定义蛋糕横向的长度为iii,纵向的长度为jjj,高度为kkk,则可以用三元组(i,j,k)(i,j,k)(i,j,k)表示蛋糕种类的唯一性。

现在小红希望你求出,共有多少种不同的奶油消耗量为xxx的蛋糕?

输入

复制2 2 2 8

2 2 2 8

输出

复制2

2

思路:

直接以每个正方形来看即可,优化第 3层即可。判断1≤n,m,p≤3000 是否符合即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define endl "\n"
void solve()
{ll n,m,p,x,i,j,r = 0,k;cin >> n >> m >> p >> x;for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){ll k = (x - i*j) /(2*(i+j));if(k >= 1 && k <= p && i*j + j*k*2 + i*k*2 == x){r++;}}	}cout << r<<endl;}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;
//	cin>>t;while(t--){solve();} return 0;
} 

小红不想做模拟题

思路:

题目意思是间A 区间 或B 区间全部变成 1 在 &

我们可以用 2 个 set  分别 记录 区间 A 的 0  和 区间 B 的 0 的 位置。

当将区间 A l r变成 1 就是 遍历 B 中区间 l r 那个位置 是否为 1 

set 的基础运用 

t.count(*it) 表示 *it 位置是否存在 

s.erase(it)表示 删掉这个位置 it会自动++;

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define endl "\n"
void solve()
{int n,q,i;cin >> n;string a,b;cin>>a>>b;set<int>  s ={n},t = {n};int ans = 0;for(int i = 0;i < n;i++){if(a[i] == '0') s.insert(i);if(b[i] == '0') t.insert(i); // B的 个数 if(a[i] == '1' && b[i] == '1') ++ans;}cin >> q;while(q--){char ch;int l,r;cin >>ch>>l>>r;--l;--r;if(ch=='A'){auto it = s.lower_bound(l);//cout << *it << endl;while(*it <= r){if(!t.count(*it)) ++ans;//cout << *it<<endl;it = s.erase(it);//cout << *it  <<endl;}}else{auto it = t.lower_bound(l);while(*it <= r){if(!s.count(*it)) ++ans;it = t.erase(it);}}cout <<ans<<'\n'; }}int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;
//	cin>>t;while(t--){solve();} return 0;
} 

 

解析:

求连续字段翻转一次或0次的升序序列。

我们用 lft 记录 其 升序的 序列长度。

用rgt 记录 其 从右到 左的降序序列长度。

在进行分类讨论:

单增、单减、先增后减、先减后增、先增后减再增。

用纸模拟一下。

我这 里的 x*y 是包含 a[i] ~ a[R] 这一段的

所以 len*(len -1)/2 - 1 的 -1 是减区 a[i]~ a[R]这一段的;

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[200010],lft[200010],rgt[200010];
void solve()
{ll ans = 0;cin >> n;for(int i = 1;i <= n;i++){cin >> a[i];} lft[0] = 0;rgt[n+1] = 0;a[0] = 0;a[n+1] = n+1;for(int i = 1;i <= n;i++){if(a[i] > a[i-1]){lft[i] = lft[i-1] + 1;}else{lft[i] = 1;}ans += lft[i];// 一直递增 的  }for(int i = n ;i >= 1; i--){if(a[i] < a[i+1]){rgt[i] = rgt[i+1] + 1;}else{rgt[i] =1;}}//cout << " ans  " << ans<<endl; for(int i = 1;i <= n-1;i++){if(a[i+1] < a[i]) //减de {int R = i+1;while(R +1 <= n && a[R+1] < a[R]){++R;}int len = R - i + 1;//下降时的部分 ans+= 1ll*len*(len-1)/2-1;//cout <<" : "<< 1ll*len*(len-1)/2-1 <<endl;//曲折的那部分  且包含 递减的那个区间  int x, y;if(a[R] > a[i-1]){x = lft[i-1]+1;	}else{x = 1;}if(a[i] < a[R+1]){y = rgt[R+1] + 1;}else{y = 1;}ans += 1ll*x*y;//小区间反转的部分 for(int j = i+1;j < R;j++)//降序 部分 {if(a[j] > a[i-1]) ans+= lft[i-1];if(a[j] < a[R+1]) ans+= rgt[R+1]; }i = R;}}cout << ans<<'\n';}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve(); return 0;
} 

时间复杂度为O(n);


http://www.ppmy.cn/devtools/4113.html

相关文章

Freertos学习第二天-Freertos基于ESP32-给任务传递单个参数

一共有两种方法 第一种: 在创建任务中可以传递参数&#xff0c;void *pt 传递了一个空指针 void Task1(void *pt) 可以运用这个空指针来设置引脚 byte * pbLED1PIN;pbLEDPIN &LED1_PIN;void * pvLED1PIN;pvLED1PIN (void *)pbLED1PIN; 以上代码意思是 byte * pbLE…

计算机网络——GBN协议实现

实验目的 编程模拟实现GBN可靠传输软件 实验内容 C 程序模拟实现Go-Back-N可靠数据传输&#xff0c;需要编写一个发送端程序和一个测试端程序来模拟传输过程 具体流程 1. 编写发送端程序&#xff0c;调用库实现socket连接&#xff0c;然后主要实现滑动窗口&#xff0c;接收…

神经网络压缩图像

简介 典型的压缩管道由四个组件组成&#xff1a; 编码&#xff1a;输入图像 x x x通过编码器函数 ε \varepsilon ε&#xff0c;将其转换为潜在表示 z z z。 量化&#xff1a;截断 z z z以丢弃一些不重要的信息 熵编码&#xff1a;使用某种形式的熵编码&#xff08;例如&…

Tomcat下载配置地址

IntelliJ IDEA是一个强大的集成开发环境&#xff0c;能够大大简化Java应用程序的开发和部署过程。而Tomcat作为一个流行的Java Web服务器&#xff0c;其与IntelliJ IDEA的整合能够提供便捷的开发环境&#xff0c;让开发人员更专注于代码的创作与优化。 在配置IntelliJ IDEA以使…

docker最新版安装

docker安装 检查系统版本即卸载旧docker安装docker依赖工具及底层依赖、仓库源安装dockerdocker阿里云镜像资源站参考 检查系统版本即卸载旧docker # 查看操作系统的发行版号 uname -r# 查看系统版本 cat /etc/redhat-release# 卸载旧版本docker(如已安装过) yum remove docke…

Jackson 2.x 系列【25】Spring Boot 集成之起步依赖、自动配置

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. 起步依赖3. 自动配置3.1 JacksonPrope…

力扣:141. 环形链表

力扣&#xff1a;141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

【MySQL面试题pro版-13】

MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#xff0c;关系数据…