IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2022牛客寒假算法基础集训营3 补题题解(未完成) -> 正文阅读

[数据结构与算法]2022牛客寒假算法基础集训营3 补题题解(未完成)


过了四题,第一次排名进前1000,打比赛确实可以带来进步,继续加油!

比赛传送门

官方题解


C 智乃买瓜(another version)

原题传送门
官方题解:
在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;

typedef long long ll ;

const int N = 1e3 + 10, mod = 1e9 + 7;

ll dp[N];
int n, m;
vector<int> ans;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	dp[0] = 1;
	cin>>m;
	
	for(int i = 1; i <= m; i ++ ){
		cin>>dp[i];
	}
	
	for(int i = 1; i <= m; ++ i){
		//这里的i代表的是基础质量,就是说如果存在dp[i],那么说明得出dp[m]的过程中用到了dp[i],进而就考虑dp[i]和那些数相加得到了dp[m] 
		while(dp[i]){
			ans.push_back(i * 2);//因为质量都是偶数,所以都考虑用了一半的 
			for(int j = 0; j <= m; ++ j){//这里的j枚举的是质量 
				if(i + j <= m) dp[i + j] -= dp[j];
				//此时背包的基础容量是i,如果i+j<=m就代表m可以装下i+j质量的西瓜,考虑方案数dp[i]时考虑了dp[j],所以要减去dp[j]的方案数
				while(i + j <= m && dp[i + j] < 0) dp[i + j] += mod;
				
				if(i + i + j <= m) dp[i + i + j] -= dp[j];
				//此时背包的基础容量是i,如果i+i+j<=m就代表m可以装下i+i+j质量的西瓜,考虑方案数dp[i]时考虑了dp[j],所以要减去dp[j]的方案数 
				while(i + i + j <= m && dp[i + i + j] < 0) dp[i + i + j] += mod;
			}
		}
	}
	
	cout<<ans.size()<<endl;
	for(int i = 0; i < ans.size(); ++ i){
		cout<<ans[i]<<" ";
	}
	return 0;
}

I 智乃的密码

原题传送门
官方题解:
在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e5 + 10;

int l, r, n;
int limit[4];//记录四种密码元素的最短区间左边界
int a[4][N];
char s[N];
ll ans;

int type(char c){
	if(c >= 'A' && c <= 'Z') return 1;
	else if(c >= 'a' && c <= 'z') return 2;
	else if(c >= '0' && c <= '9') return 3;
	else return 0;
}

void presum(int a[]){
	for(int i = 1; i <= n; ++ i){
		a[i] += a[i - 1];
	}
} 

int has(int a[], int l, int r){//判断l~r还有没有a[]对应的元素 
	return a[r] - a[l - 1] > 0; 
}

int get_d(){
	int temp[4];
	memcpy(temp, limit, sizeof temp);//此时limit内装的是i对应的四种密码的最小包含区间 
	//temp[0]记录的是包含大写字母的区间的左端点 
	//temp[1]记录的是包含小写字母的区间的左端点
	//temp[2]、temp[3]此时的含义与上同 
	sort(temp , temp + 4);
	//排完序后
	//temp[0]记录的是四个最小区间中最靠左的左端点,因为只需三种必要元素就可以得到密码,所以temp[0]战略性放弃 
	return temp[1];//返回可以构成密码的最小区间的左端点 
}

int cal(int i){
	int L = 1, R = n;
	L = max(L, i - r + 1);//L此时记录的是密码长度最长的情况下最左端的端点值 
	R = min(R, i - l + 1);//R此时记录的是密码长度最短的情况下最左端的端点值 
	R = min(get_d(), R);//R此时的值更新为能构成区间的最左端的点 
	return R - L >= 0 ? R - L + 1 : 0;//R-L>0表示以i为右端点,向左延伸长度为r的字符串中,左边部分的无关元素数量大于0,这些无关元素的数量就是可以构成的密码数量
	//如果五官元素的数量小于0,表示不能构成密码,返回构成的密码数量为0 
}

//妙在利用a数组,以前缀和的形式判断这个区间内有没有密码对应的元素 

int main()
{
	cin>>n>>l>>r;
	scanf("%s", s + 1);
	
	for(int i = 1; i <= n; ++ i){
		a[type(s[i])][i] ++ ;//标记s[i]是那种密码 
	}
	
	for(int i = 0; i < 4; ++ i){
		presum(a[i]);//找出每种密码的数量前缀和 
	}
	
	for(int i = 1; i <= n; ++ i){
		for(int j = 0; j < 4; ++ j){//分别判断这四种密码的最小存在区间的区间左端点 
			while(has(a[j], limit[j] + 1, i)) limit[j] ++ ;//字符串是从1开始记录的,limit数组内的值默认为0,应该+1开始 
		}
		//分别找到i对应的包含四种密码的最短区间 
		ans += cal(i);//找到以i为右端点的合法的密码数量,遍历每个i,加在一起就是总的密码数量 
	}
	cout<<ans<<endl;
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-29 23:20:21  更:2022-01-29 23:22:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:23:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码