Codeforce 963

news2024/12/25 9:28:26

CF 963

  • B 模拟加贪心 偶数个数
  • C 模拟+前缀和 灯能否全亮
  • D 二分+DP 中位数尽可能大
  • F1 模拟+镜像

题目链接

B 模拟加贪心 偶数个数

在这里插入图片描述

考点:贪心

思路:除了全是偶数的情况,其他的情况都需要将偶数转换为奇数。最少的操作步数是偶数个数,如果有一步操作执行之前最小的偶数都比最大的奇数大,则操作步数要加1,即最后结果是偶数个数+1.

代码1:

t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))

    s = -1
    v = []
    for x in a:
        if x%2 == 0:
            v.append(x)
        elif x > s:
            s = x
    v.sort()

    if s == -1 or v == []:
        print(0)
        continue
    
    ans = len(v)
    for t in v:
        if t < s:
            s += t
        else:
            ans += 1
            break

    print(ans)

代码2:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define int long long 
#define x first
#define y second

typedef long long ll;

void solve(){
	int n;cin>>n;
	vector<int> odd,even;
	for(int i=0;i<n;i++){
		int x;cin>>x;
		if(x%2==0) even.push_back(x);
		else odd.push_back(x);
	}
	sort(even.begin(),even.end());
	sort(odd.begin(),odd.end());
	if(even.size()==n||odd.size()==n){
		cout<<0<<endl;
		return;
	}
	int mx=*max_element(odd.begin(),odd.end());
	int ans=0,f=0;
	for(int i=0;i<even.size();i++){
		if(even[i]<mx){
			mx+=even[i];
			ans++;
		}else{
			f=(even.size()-1-i+2);
			break;
		}
	}
	if(f) ans+=f;
	cout<<ans<<endl;
}


signed main(){
	int T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

C 模拟+前缀和 灯能否全亮

在这里插入图片描述

考点:模拟,前缀和

思路:将每盏灯的每个打开时刻标记为1,关闭时刻标记为-1。当前时刻的前缀和为1即表示有一盏灯打开,为0则表示没有灯打开。最后判断是否有时刻打开灯的数量为n。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define int long long 
#define x first
#define y second

typedef long long ll;

void solve(){
	int n,k;cin>>n>>k;
	vector<int> a(n+1),s(8*k+2),c(8*k+1);
	int mx=0;
	for(int i=0;i<n;i++){
		cin>>a[i];
		mx=max(mx,a[i]);
	} 
	int m=2*k;
	for(int i=0;i<n;i++){
		int t=a[i]%m,f=1;
		while(t<=8*k){
			if(f) c[t]++;
			else c[t]--;
			t+=k;
			f=1-f;
		}
	}
	
	for(int i=0;i<8*k;i++){
		s[i+1]=s[i]+c[i];
	}
	for(int i=mx%m+m+1;i<=8*k;i++){
		if(s[i]==n){
			int t=i-1-(mx%m+m);
			cout<<mx+t<<endl;
			return;
		}
	}
	cout<<-1<<endl;
}


signed main(){
	int T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

D 二分+DP 中位数尽可能大

在这里插入图片描述

考点:二分+序列DP

思路:对于中位数,大多数情况可以考虑二分。本题的trick是删除k个连续数的技巧。

代码1:本质思路

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;

#define int long long
#define x first
#define y second

typedef long long ll;
const int inf=1e9+10;
int u,v;

void solve() {
	int n,k;
	cin>>n>>k;
	vector<int> a(n);
	for(int i=0; i<n; i++) cin>>a[i];

	if(k==1) {
		cout<<*max_element(a.begin(),a.end())<<endl;
		return;
	}
	if(n<=k) {
		sort(a.begin(),a.end());
		cout<<a[(n-1)/2]<<endl;
		return;
	}

	u=(n-1)/k+1,v=(n-1)%k+1;//这里要注意 
	vector<vector<int>> b(u+1,vector<int>(v+1));
//	vector<vector<int>> f(u+1,vector<int>(v+1,-inf));//不能在这里定义,不然f数组不能每次执行check函数就初始化一次 
	
	for(int i=0; i<u; i++) {
		for(int j=0; j<v; j++) {
			b[i][j]=a[i*k+j];
		}
	}
 
	
	auto check=[&] (int x) {
		vector<vector<int>> f(u+1,vector<int>(v+1,-inf));//不能全部初始为-1,要尽量初始化更小一点 
		for(int i=0; i<u; i++) {
			for(int j=0; j<v; j++) {
				if(i>0) f[i][j]=max(f[i][j],f[i-1][j]);
				if(j==0) {
					int t=(b[i][j]>=x?1:-1);
					f[i][j]=max(f[i][j],t);
				} else {
					if(j>0) f[i][j]=max(f[i][j],f[i][j-1]+(b[i][j]>=x?1:-1));
					if(i>0&&j>0) f[i][j]=max(f[i][j],f[i-1][j-1]+(b[i][j]>=x?1:-1));
				}
//				cout<<"----- "<<i<<" "<<j<<' '<<f[i][j]<<endl;
			}
		}
		int ans=-1e9;
		for(int i=0;i<u;i++){
			ans=max(ans,f[i][v-1]);
		}
//		return ans>=(v+2)/2;
		return ans>0;
	};//逗号 

	int l=1,r=1e9+10;
	while(l+1<r) {
		int mid=l+r>>1;
		if(check(mid)) l=mid;
		else r=mid;
	}
	cout<<l<<endl;
	
}


signed main() {
	int T=1;
	cin>>T;
	while(T--) {
		solve();
	}
	return 0;
}

代码2:优化

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second

typedef long long ll;
const int N=5e5+10,inf=1e9+10;
int a[N],b[N],f[N];
int n,k;

bool check(int x){
//	memset(f,-0x3f,sizeof f);//一定要注意超时 
	for(int i=0;i<n;i++){
		if(a[i]>=x) b[i]=1;
		else b[i]=-1;
	}
	f[0]=b[0];
	for(int i=1;i<n;i++){
		if(i%k==0){
			f[i]=max(f[i-k],b[i]);
		}else{
			f[i]=f[i-1]+b[i];
			if(i>k){
				f[i]=max(f[i],f[i-k]);
			}
		}
	}
	return f[n-1]>0;
}

void solve(){
	cin>>n>>k;
	for(int i=0;i<n;i++) cin>>a[i];
	
	int l=1,r=inf;
	while(l+1<r){
		int mid=l+r>>1;
		if(check(mid)) l=mid;
		else r=mid;
	} 
	cout<<l<<endl;
}

signed main(){
	int T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

F1 模拟+镜像

在这里插入图片描述
考点:模拟+镜像

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
#define int long long 
string s;
int n,k,w,h;
int tx[2*N],ty[2*N];
map<pair<int,int>,int> cnt;


void solve(){
	cin>>n>>k>>w>>h>>s;
	cnt.clear();
	int x=0,y=0;
	for(int i=0;i<n;i++){
		if(s[i]=='L') x--;
		if(s[i]=='R') x++;
		if(s[i]=='U') y++;
		if(s[i]=='D') y--;
		x=(x+2*w)%(2*w);
		y=(y+2*h)%(2*h);
		cnt[{x,y}]++;
	}
	int ans=0;
	for(int i=0;i<k;i++){
		int vx=(-i*x%(2*w)+2*w)%(2*w);
		int vy=(-i*y%(2*h)+2*h)%(2*h);
		ans+=cnt[{vx,vy}];
	}
	cout<<ans<<endl;
}


signed main(){
	int T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

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

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

相关文章

IOS 15 实现Toast和小菊花Loading提示

本文主要是实现toast和loading两种提示功能&#xff0c;例如&#xff1a;登陆时参数不正确提示&#xff0c;toast提示后会自动隐藏。加载提示&#xff1a;不会自动隐藏&#xff0c;常用于网络请求&#xff0c;上传等。 添加依赖 #提示框架 #https://github.com/jdg/MBProgress…

20240828 每日AI必读资讯

8岁女孩玩转AI编程&#xff0c;45分钟打造聊天机器人&#xff0c;Karpathy都看呆了 - 新晋顶流AI代码编辑器——Cursor&#xff0c;已经进化到了“0手工代码”阶段。 - 提供了多个AI模型&#xff0c;包括GPT-4、GPT-4o和Claude 3.5 Sonnet等&#xff0c;可以通过跟大模型聊天…

一文弄懂MySQL中的锁

MySQL中的锁概述 MySQL中的锁机制是数据库管理系统用于控制并发操作的一种手段&#xff0c;主要用于保证数据的一致性和完整性。当多个事务同时操作同一数据时&#xff0c;锁机制可以防止数据冲突和确保事务的隔离性。 在MySQL中&#xff0c;锁可以分为三大类&#xff1a;全局…

如何用Python Django和Vue构建网络电视剧收视率分析系统?

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

《计算机操作系统》(第4版)第11章 多媒体操作系统 复习笔记

第11章 多媒体操作系统 一 、多媒体系统简介 1. 多媒体的概念 多媒体 (multimedia) 目前没有统一的定义&#xff0c;一般是指多种方法、多种形态传输(传播)的信息介质、多种 载体的表现形式以及多种存储、显示和传递方式。 2.超文本和超媒体 (1)超文本 (hypertext)。 (2)超链接…

探索Python性能监控的瑞士军刀:psutil的神秘面纱

文章目录 探索Python性能监控的瑞士军刀&#xff1a;psutil的神秘面纱背景&#xff1a;为何psutil不可或缺&#xff1f;什么是psutil&#xff1f;如何安装psutil&#xff1f;五个简单的库函数使用方法场景应用&#xff1a;psutil在实际开发中的妙用常见问题与解决方案总结 探索…

性价比高的开放式耳机?开放式耳机推荐

在开放式耳机市场中&#xff0c;有多个品牌的性价比表现较为突出。以下是一些性价比较高的开放式耳机品牌及其产品特点&#xff1a; 1.虹觅&#xff08;Holme&#xff09; 虹觅Fit2&#xff1a; 以其简约而不失精致的设计&#xff0c;首先吸引了众多目光。这款耳机采用可调节…

苹果M4芯片Mac全面曝光 或10月发布

彭博社的马克・古尔曼&#xff08;Mark Gurman&#xff09;发布博文&#xff0c;曝料称苹果内部正在测试 4 款采用 M4 芯片的 Mac 设备&#xff0c;有望今年秋季&#xff08;可能是 10 月&#xff09;发布。 古尔曼表示苹果计划今年升级 MacBook Pro、Mac mini 和 iMac 产品线&…

驱动:中断底半部 platform平台总线

中断底半部实现方法&#xff1a; 1. 软中断2. tasklet 3. workqueue 解释 workqueue和tasklet是Linux内核中用于处理中断后续任务的两种机制&#xff0c;它们在中断处理流程中扮演着重要的角色。下面是对它们的详细解释&#xff1a; Tasklet 定义与作用&#xff1a; Taskl…

Vue笔记总结(Xmind格式):第二天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; vue知识总结&#xff1a; 创建vue脚手架&#xff1a; 1.安装Node.js&#xff1a;Vue CLI作为一个npm包&#xff0c;需要Node.js来安装和运行。 2.安装Vue CLI&#xff1a;cmd指令 npm install -g vue/cli 3.创…

【微前端】前端微服务框架对比和技术选型

文章目录&#xff1a; 目录 文章目录&#xff1a; 前言&#xff1a; 具体内容&#xff1a; 1.什么是微前端 2.使用微服务的场景&#xff1a; iframe方案的缺点&#xff1a; 3.主流微服务框架介绍 2.1 无界-腾讯 官网 github地址&#xff1a; 无界的运行模式 简单了…

git笔记:git常用命令备忘录

1、工作区域和文件状态 1.1、工作区域 git的数据管理分为四个区域&#xff1a; 工作区&#xff08;Working Directory&#xff09; 本地工作目录&#xff0c;是我们电脑上的目录&#xff0c;是我们实际编写代码的区域&#xff0c;修改完工作区的文件后可以使用git add命令将…

Web开发:在 try-catch 块中有效捕捉和记录日志的最佳实践

目录 一、控制台程序&#xff08;demo&#xff09; 二、封装方法 三、实现效果 一、控制台程序&#xff08;demo&#xff09; using System.Diagnostics;namespace Progaram {class Program{public class Student{public int Id { get; set; }public string Name { get; se…

DataWhale AI夏令营-《李宏毅深度学习教程》笔记

DataWhale AI夏令营-《李宏毅深度学习教程》笔记 第三章 深度学习基础补充一些基础临界点及其种类逃离临界点方法批量动量自适应学习率学习率调度 分类分类损失批量归一化 之前一直接触的LLM大模型做一些应用&#xff0c;或者传统的自然语言处理&#xff0c;都是直接拿别人的模…

坐牢第三十天(c++)

1.作业&#xff1a; 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream> #include <stdio.h> #include <string> using namespace std; int main(int argc, char const *argv[]) {string st…

什么软件可以用平板远程控制电脑?

在当今快节奏的工作和生活中&#xff0c;使用平板远程控制电脑已成为一种便捷高效的办公方式。无论你是想随时随地访问办公室的电脑&#xff0c;还是需要在旅途中进行紧急工作任务&#xff0c;Splashtop都是你的不二选择。本文将介绍如何使用Splashtop通过平板远程控制电脑&…

谷粒商城实战笔记-260-商城业务-消息队列-可靠投递-消费端确认

文章目录 一,Ack消息确认机制简介1,简介2,两个常用的Api二,消费者端消息确认实战三,RabbitMQ可靠性保障总结1,生产者2,消费者一,Ack消息确认机制简介 消费者端的确认机制(ACK/NACK)是RabbitMQ中一种重要的特性,它允许消费者告知Broker它们是否成功处理了接收到的消息…

ARM32开发——(六)GPIO_USART通信原理

1. 串行通信和并行通信 1.1 串行通信 串行通信是一种数据传输的方式&#xff0c;它是指将数据按照一位一位的顺序依次发送和接收&#xff0c;常用于远距离通信、嵌入式系统和低带宽传输场景下。串行通信相对于并行通信而言&#xff0c;只需要传输一条数据线&#xff0c;相对简…

Cgroup Driver配置异常导致的节点k8s涉及到的pod无法启动问题的处理

文章目录 前言一、现象二、问题定位1.docker服务检查2.message日志检查3.检查Cgroup Driver的配置4.修改/etc/docker/daemon.json文件 总结 前言 Cgroup Driver配置异常导致的节点k8s涉及到的pod无法启动问题的处理。 同事有台云主机重启之后&#xff0c;发现k8s相关的pod全部…

优维er看网易云之崩:巨头稍息的一小步,行业前进的一大步

撰文&#xff1a;右耳失聪的左撇子 制图&#xff1a;脾气超好 8月19日&#xff0c;网易云当了半天的“网抑云”&#xff0c;不开玩笑&#xff0c;我认为这是一场&#xff1a;真技术滑铁卢。 和很多朋友一样&#xff0c;数字音乐早已经深度融入我的日常生活&#xff0c;而作为一…