Codeforces Round 966 (Div. 3)(A,B,C,D,E,F)

news2024/12/25 23:52:56

A. Primary Task

签到

void solve()
{
	string s;
	cin>>s;
	bool bl=true;
	if(s.size()<=2)bl=false;
	else
	{
		if(s.substr(0,2)=="10")
		{
			if(s[2]=='0')bl=false;
			else if(s[2]=='1'&&s.size()<=3)bl=false;	
		}
		else bl=false;
	}
	if(bl)cout<<"YES\n";
	else cout<<"NO\n";
	return ;
}

B. Seating in a Bus

签到

#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
int q[N],a[N];
void solve()
{
	cin>>n;
	_rep(i,0,n+1)a[i]=0;
	_rep(i,1,n)cin>>q[i];
	_rep(i,1,n)
	{
		if(i==1)a[q[i]]=1;
		else if(!a[q[i]-1]&&!a[q[i]+1])
		{
			cout<<"NO\n";
			return;
		}
		a[q[i]]=1;
	}
	cout<<"YES\n";
	return;
}

C. Numeric String Template

签到

题意是字符串和数组必须一一对应,注意要开两个map避免一个数字对应多个字母

#define _for(i,n) for(int i=0;i<(n);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
int q[N];
void solve()
{
	cin>>n;
	_rep(i,0,n-1)cin>>q[i];
	cin>>m;
	while(m--)
	{
		string s;
		cin>>s;
		map<int,int>mp,has;
		if(s.size()!=n)cout<<"NO\n";
		else
		{
			bool bl=false;
			_for(i,s.size())
			{
				if(!mp.count(s[i]))
				{
					if(!has.count(q[i]))mp[s[i]]=q[i],has[q[i]]=s[i];
					else 
					{
						cout<<"NO\n";
						bl=true;
						break;
					}
				}
				else if(mp[s[i]]!=q[i])
				{
					cout<<"NO\n";
					bl=true;
					break;
				}
			}
			if(!bl)cout<<"YES\n";
		}
	}
	return ;
}

D. Right Left Wrong

题意,给定长度为n的数组和一个长度为n的LR序列,每次选择L***R都可以获取L~R之间的所有数字的和,但是每个L,R只能用一次,问能得到的最大值是多少

可以发现,无论怎么选择区间,如果两个区间不是相互包含的关系,那么就有更优的解,那就是选两个区间最左边没使用过的L和两个区间最右边没使用过的R,这样可以保证答案最大

举例说明:

第一行不如第二行(第二行多出来两个没有选择的”RL“)

第二行不如第三行(第三行选择最左L和最右R就可以包括第二行的所有情况)

第四行和第三行等价(相交也可以转化为包含的关系)

综上所述,只需要贪心 寻找从1~n 每个L的最右边没使用过的R就可以了,然后用前缀和把每一次的分数加上

#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
int q[N],qian[N];
void solve()
{
	cin>>n;
	vector<int>v;
	_rep(i,1,n)cin>>q[i],qian[i]=q[i]+qian[i-1];
	string s;
	cin>>s;
	s=" "+s;
	_rep(i,1,n)
		if(s[i]=='R')v.pb(i);
	int now=v.size()-1,res=0;
	_rep(i,1,n)
	{
		if(s[i]=='L')
		{
			if(now>=0&&v[now]>i)res+=qian[v[now]]-qian[i-1],now--;
			else break;
		}
	}
	cout<<res<<'\n';
	return ;
}

E. Photoshoot for Gorillas

题意抽象出来就是W个大猩猩每一只高度为a[i],然后在一个n*m的矩阵的格子里面,每次划定一个k*k的正方形,奇观度的值加上正方形内部所有大猩猩的高度,在划定完所有不同位置的k*k正方形后为了使得奇观度最大,大猩猩应该如何放置

思路:一些格子被重复算了,那么重复次数越多的格子放的大猩猩高度尽可能高就能使答案最大,那么就把所有的格子倍率,也就是重复次数算出来,然后把格子倍率和大猩猩高度分别排序就能计算出最后答案

然后就是计算格子倍率的问题,现在只考虑列的重复次数样例如下

这个位置列被重复算的次数最多是2,那么也就是说,列重复的次数取决于这个点到左右两端的距离的最小值,也就是x=min(j,m-j+1),同时重复次数显然不能超过k,所以x=min(min(j,m-j+1),k);

但是还有一个问题,假设这个点到左端点的距离取到最小值,但是此时小正方形右边可能会超出矩形的范围怎么办

那么还要加一个约束条件,假设此时的小正方形的最左边为y,那么就有y+k-1<=m,也就是y<=(m-k+1)

所以最后计算列重复的次数的公式为:x=min(min(j,m-j+1),min(k,m-k+1));

与行重复次数相乘就是某一个点的重复次数

代码实现

#include <map>
#include <set>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define pp pop_back()
#define int long long
#define laile cout<<"laile"<<endl
#define lowbit(x) ((x)&(-x))
#define double long double
#define sf(x) scanf("%lld",&x)
#define sff(x,y) scanf("%lld %lld",&x,&y)
#define sd(x) scanf("%Lf",&x)
#define sdd(x,y) scanf("%Lf %Lf",&x,&y)
#define _for(i,n) for(int i=0;i<(n);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _pre(i,a,b) for(int i=(a);i>=(b);--i)
#define all(x) (x).begin(), (x).end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const int N=1e6+10,INF=4e18;
int n,m,k,cn;
int q[N];
void solve()
{
	cin>>n>>m>>k;
	cin>>cn;
	_rep(i,1,cn)cin>>q[i];
	sort(q+1,q+1+cn,greater<int>());
	vector<int>now;
	_rep(i,1,n)
	_rep(j,1,m)
	now.pb(min(min(i,n-i+1),min(k,n-k+1))*min(min(j,m-j+1),min(k,m-k+1)));
	sort(all(now),greater<int>());
	int res=0;
	_rep(i,0,cn-1)
	{
//		cout<<q[i+1]<<" "<<now[i]<<endl;
		res+=q[i+1]*now[i];
	}
	cout<<res<<'\n';
	return ;
}
signed main()
{
	IOS;
	int T=1;
	cin>>T;
	while(T--)
		solve();
	return 0;
}

F. Color Rows and Columns

题意:

针对每一个小矩形(a*b),每次涂色都选择当前边最短的那条(假设为a),然后使用a次操作获得一分

然后未涂色的矩形又是一个新的小矩形,直到最后一步1*1的矩形,可以用1次操作获得2分,这样操作1为最优的操作

那每个小矩形要操作几次?要从每个小矩形上得到多少分才是最优解?感觉贪心不能解决这个问题,于是用DP

由于要至少得到V分,那么不妨设V为体积

假设f[i]:得分为i的时候操作次数最少为f[i]

那么每一个小矩形显然要选择一种得分v来对应相应的最小操作数为w

显然每一个小矩形都可以计算出几组{v,w}然后选择其中的一组

那么用一个分组背包就可以解决这个问题

#include <map>
#include <set>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define pp pop_back()
#define int long long
#define laile cout<<"laile"<<endl
#define lowbit(x) ((x)&(-x))
#define double long double
#define sf(x) scanf("%lld",&x)
#define sff(x,y) scanf("%lld %lld",&x,&y)
#define sd(x) scanf("%Lf",&x)
#define sdd(x,y) scanf("%Lf %Lf",&x,&y)
#define _for(i,n) for(int i=0;i<(n);++i)//
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _pre(i,a,b) for(int i=(a);i>=(b);--i)
#define all(x) (x).begin(), (x).end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const int N=1e6+10,INF=4e18;
int n,m;
int a[N],b[N];
struct aa
{
	int v,w;
};
int f[10010];
void solve()
{
	cin>>n>>m;
	memset(f,0x3f,(m+1)*8);
	f[0]=0;
	_rep(i,1,n)
	{
		int a,b,w=0,v=0;
		cin>>a>>b;
		vector<aa>q;
		if(a>b)swap(a,b);
		while(b>a)
		{
			b--;
			w+=a,v++;
			q.pb({v,w});
		}
		if(a==b&&a==1)
			q.pb({v+2,w+1});
		else
		{
			_pre(i,a,1)
			{
				w+=i,v++;q.pb({v,w});
				if(i==a)continue;
				w+=i,v++;
				if(i!=1)q.pb({v,w});
				else q.pb({v+1,w});
			}
		}
//		for(auto i:q)cout<<i.v<<" "<<i.w<<endl;
		for(int j=m;j>=0;j--)
			for(int k=0;k<q.size();k++)
//				if(q[k].v<=j)
					f[j]=min(f[j],f[max(j-q[k].v,0ll)]+q[k].w);
	}
	if(f[m]!=0x3f3f3f3f3f3f3f3f)cout<<f[m]<<'\n';
	else cout<<"-1\n";
	return ;
}
signed main()
{
	IOS;
	int T=1;
	cin>>T;
	while(T--)
		solve();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构第二天

分文件编程实现&#xff1a; main.c #include <stdio.h> #include <stdlib.h> #include "seqlist.h"int main(int argc, char const *argv[]) {seqlist_p p CreateEpSeqlist();InsertIntoSeqlist(p, 0, 10);InsertIntoSeqlist(p, 1, 20);InsertIntoSeql…

打卡第四十五天:不同的子序列、两个字符串的删除操作、编辑距离

一、不同的子序列&#xff08;困难&#xff09; 题目 文章 视频 这道题目如果不是子序列&#xff0c;而是要求连续序列的&#xff0c;那就可以考虑用KMP。相对于72. 编辑距离简单了不少&#xff0c;因为本题相当于只有删除操作&#xff0c;不用考虑替换增加之类的。但相对于…

Mapreduce_Distinct数据去重

MapReduce中数据去重 输入如下的数据&#xff0c;统计其中的地址信息&#xff0c;并对输出的地址信息进行去重 实现方法&#xff1a;Map阶段输出的信息K2为想要去重的内容&#xff0c;利用Reduce阶段的聚合特点&#xff0c;对K2进行聚合&#xff0c;去重。在两阶段中&#xff…

【数据结构篇】~顺序表

顺序表前言 想要学好数据结构的三大基本功&#xff1a;1.结构体2.指针3.动态内存开辟,这三样将是贯彻整个数据结构的工具。&#xff08;可以去这里了解这三大基本功&#xff09; 顺序表也是线性表的一种&#xff0c;那线性表又是什么呢&#xff1f; 线性表&#xff08;linear …

系列:水果甜度个人手持设备检测-无损检测常用技术和方式汇总

系列:水果甜度个人手持设备检测 -- 无损检测常用技术和方式汇总 概述 无损检测以不损坏被检测对象的使用性能为前提&#xff0c;以物理或化学方法为手段&#xff0c;借助相应的设备器材&#xff0c;按照规定的技术要求&#xff0c;对材料、零部件、结构件进行有效的检验和测…

软件测试第1章 软件测试是什么

目录​​​​​​​ 内容说明 一、软件测试与质量概览需要熟悉什么 二、如何理解质量保证 三、软件测试的误区-程序员和测试的关系 四、软件测试是什么&#xff1f; 五、软件测试的目的 六、软件测试与软件质量保证 七、软件测试的必要性 八、软件测试的基本概念分析 …

HarmonyOS Next 系列之列表下拉刷新和触底加载更多数据实现(十一)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】 介绍基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码-能管系统软件架构

js 深入学习各种继承方法使用场景

前言 问题&#xff1a; JS 如何实现继承呢&#xff1f;主要有几种继承方式及分别适用于哪些场景呢&#xff1f; 我们学习高级语言&#xff0c;就必须学习面向对象&#xff0c;想要成为高手&#xff0c;就必须学习别人不会的&#xff0c;就比如JS中的继承&#xff0c;好多前端人…

ASP.NET在线交流论坛管理系统

ASP.NET在线交流论坛管理系统 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 用户功能有个人信息管理 帖了信息管理 意见反馈信息管理 点赞管理 收藏管理 后台管理员可以进行用户管理 …

部署及使用seata

目录 1.下载seata1.7.0.zip 2.上传至云服务器&#xff0c;使用unar工具解压 3.配置application.yml&#xff0c;主要配置如下参数 4.为seata执行mysql脚本 5.配置nacos配置中心 *6.启动seata服务器 问题&#xff1a;“cause:can not register RM,err:can not connect to…

国外项目管理软件最佳实践:选型与应用

国内外主流的10款国外项目管理软件对比&#xff1a;PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、ProofHub、Zoho Projects、Hive。 在寻找适合的国外项目管理软件时&#xff0c;你是否感到不知从何选择&#xff1f;市场上琳琅满目的选项往往令人眼花缭乱&…

微软披露Office最新零日漏洞,可能导致数据泄露

近日&#xff0c;微软披露了 Office 中一个未修补的零日漏洞&#xff0c;如果被成功利用&#xff0c;可能导致敏感信息在未经授权的情况下泄露给恶意行为者。 该漏洞被追踪为 CVE-2024-38200&#xff08;CVSS 得分&#xff1a;7.5&#xff09;&#xff0c;被描述为一个欺骗漏洞…

关于xilinx的FFTIP的使用和仿真

工具&#xff1a;vivado2018.3&#xff0c;modelsim10.6d 场景&#xff1a;在进行数据进行频谱分析的时候&#xff0c;使用FPGA来完成FFT的计算可以加快数据的计算速度。 下面使用仿真完成DDS产生的数据的FFT以及IFFT。原始数据使用DDSIP产生&#xff0c;通过IP产生的波形数据…

旧手机NAS方案

这里写目录标题 1、参考2、alpine-term-v16.0-release.apk下载安装3、电脑端ssh连接3、安装docker3.1 网络配置3.2 配置APK源 1、参考 【Docker与Termux】闲置旧安卓手机上的NAS无缝部署方案 https://blog.csdn.net/AnRanGeSi/article/details/138717589 【Alpine Term】Andr…

线程与进程(5)

目录 信号量&#xff08;线程的同步 &#xff09; 信号量的分类&#xff1a; 框架&#xff1a; &#xff08;1&#xff09;信号量的定义(semaphore): &#xff08;2&#xff09;信号量的初始化&#xff1a; &#xff08;3&#xff09;信号量的PV 操作 &#xff08;4&#…

Ubuntu Linux安装Go语言

Golang是Google公司在2007年开始开发的一种静态强类型、编译型语言。Go语言被设计成一门简单、高效且可靠的编程语言&#xff0c;旨在解决大规模网络服务和分布式系统开发中的复杂性问题。Go语言结合了动态语言的开发速度和C/C等编译型语言的性能与安全性&#xff0c;提供了强大…

[DL]深度学习_针对图像恢复的高效扩散模型DiffIR

DiffIR: Efficient Diffusion Model for Image Restoration Abstract 扩散模型(DM)通过将图像合成过程建模为去噪网络的顺序应用&#xff0c;实现了SOTA的性能。然而&#xff0c;与图像合成不同的是&#xff0c;图像恢复(IR)对生成符合ground-truth的结果有很强的约束。因此&am…

家穷就去互联网

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

AI编程工具合集(附使用地址)

在AI编程工具领域&#xff0c;随着技术的飞速发展&#xff0c;越来越多的工具正在改变编程的方式。以下是目前排名前十的AI编程工具合集&#xff0c;提供了丰富的功能来提升开发效率&#xff0c;并在多个编程场景中帮助开发者解决问题。 1. GitHub Copilot • 是什么: GitHub C…