Codeforces Round 982 (Div. 2)(A~C)

news/2024/11/7 19:31:55/文章来源:https://www.cnblogs.com/cjcf/p/18533820

对dp还不是特别熟练
只做到了C(还是太菜了),开始前刚好各种事情来了,vp晚了10多分钟开才始做题,喜提排名(不是)3000+,后面有时间就尽量把dp补掉

A. Rectangle Arrangement

你需要在一个无限的方格网格上涂色,所有格子最初都是白色的。为了完成这项任务,你有 \(n\) 个印章。每个印章是一个宽度为 \(w_i\)、高度为 \(h_i\) 的矩形。
你将使用 每个 印章 恰好一次 在网格上涂一个与印章同样大小的矩形区域为黑色。你不能旋转印章,对于每个格子,印章必须完全覆盖它或者完全不覆盖它。你可以在网格上的任何位置使用印章,即使印章覆盖的一些或全部格子已经是黑色的。
在使用完所有印章之后,你能得到的黑色方格区域的 周长之和 的最小值是多少?
\(Input\)
每个测试包含多个测试案例。第一行包含测试案例的数量 t(1≤t≤500)。每个测试案例的描述紧随其后。
每个测试案例的第一行包含一个整数 n(1≤n≤100)。
接下来的 n 行中,第 i 行包含两个整数 wi 和 hi(1≤wi,hi≤100),分别代表第 i 个印章的宽度和高度。
\(Output\)
对于每个测试案例,输出一个整数——在使用完所有印章后,你能得到的黑色方格区域周长之和的最小值。
\(Sample\)
5
5
1 5
2 4
3 3
4 2
5 1
3
2 2
1 1
1 2
1
3 2
3
100 100
100 100
100 100
4
1 4
2 3
1 5
3 2


20
8
10
400
16
思路:这题我是老老实实进行了区域覆盖,然后dfs了一遍区域,看周长
没想到是小学数学,\(2*max(h)*max(w)\),也确实是啊,vp时真是脑子抽了

#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<deque>
#include<cctype>
#include<string.h>
#include<math.h>
#include<time.h>
#include<random>
#include<stack>
#include<string>
#define ll                                     long long
#define lowbit(x) (x & -x)
//#define endl "\n"//                           交互题记得删除
using namespace std;
mt19937 rnd(time(0));
const ll mod = 998244353;
ll ksm(ll x, ll y)
{
ll ans = 1;
while (y)
{
if (y & 1)
{
ans = ans % mod * (x % mod) % mod;
}
x = x % mod * (x % mod) % mod;
y >>= 1;
}
return ans % mod % mod;
}
ll gcd(ll x, ll y)
{
if (y == 0)
return x;
else
return gcd(y, x % y);
}
void fio()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
struct s
{ll x,y;
}p[2500];
ll a[400][400];
ll d[4]={0,1,-1,0};
ll e[4]={1,0,0,-1};
int main()
{fio();ll t;cin>>t;while(t--){for(ll i=1;i<=100;i++){for(ll j=1;j<=100;j++)a[i][j]=0;}ll n;cin>>n;for(ll i=1;i<=n;i++){ll w,h;cin>>w>>h;for(ll k=1;k<=w;k++){for(ll u=1;u<=h;u++){a[k][u]=1;}}}ll ans=0;for(ll i=0;i<=101;i++){for(ll j=0;j<=101;j++){for(ll u=0;u<=3;u++){ll nx=i+d[u];ll ny=j+e[u];if(nx>=1&&nx<=100&&ny>=1&&ny<=100&&a[i][j]==0){if(a[nx][ny])ans++;}}   }}cout<<ans<<endl;}
}

B. Stalin Sort

斯大林排序(Stalin Sort)是一种幽默的排序算法,它不是为了正确地对元素进行排序,而是为了消除那些不在适当位置的元素,从而实现 \(\mathcal{O}(n)\) 的时间复杂度。
斯大林排序的步骤如下:从数组的第二个元素开始,如果它严格小于前一个元素(忽略那些已经被删除的元素),那么就删除它。继续遍历数组,直到数组按照非递减顺序排序。例如,数组 \([1, 4, 2, 3, 6, 5, 5, 7, 7]\) 在经过斯大林排序后变为 \([1, 4, 6, 7, 7]\)
我们定义一个数组为“易受攻击”的,如果你可以通过反复对它的任意子数组应用斯大林排序,无论需要多少次,来将其排序成非递增顺序。
给定一个包含 \(n\) 个整数的数组 \(a\),确定必须从数组中移除的最小整数数量,以使其变得“易受攻击”。
\(^{\text{∗}}\) 如果数组 \(a\) 可以通过从数组 \(b\) 删除若干(可能为零或全部)开头和结尾的元素来获得,那么数组 \(a\) 就是数组 \(b\) 的一个子数组。
\(Input\)
每个测试包含多个测试案例。第一行包含一个整数 \(t\)\(1 \le t \le 500\))——测试案例的数量。之后是测试案例的描述。
每个测试案例的第一行包含一个整数 \(n\)\(1 \le n \le 2000\))——数组的大小。
每个测试案例的第二行包含 \(n\) 个整数 \(a_1, a_2, \ldots, a_n\)\(1 \le a_i \le 10^9\))。
保证所有测试案例中 \(n\) 的总和不超过 \(2000\)
\(Output\)
对于每个测试案例,输出一个整数——必须从数组中移除的最小整数数量,以使其变得“易受攻击”。
\(Sample\)
6
7
3 6 4 9 2 5 2
5
5 4 4 2 2
8
2 2 4 4 6 6 10 10
1
1000
9
6 8 9 10 12 9 7 5 4
7
300000000 600000000 400000000 900000000 200000000 400000000 200000000


2
0
6
0
4
2
样例解析:
在第一个测试案例中,最优解是移除数字 \(3\)\(9\)。这样我们剩下的数组为 \(a = [6, 4, 2, 5, 2]\)。为了证明这个数组是“易受攻击”的,我们可以先对子数组 \([4, 2, 5]\) 应用斯大林排序,得到 \(a = [6, 4, 5, 2]\),然后对子数组 \([6, 4, 5]\) 应用斯大林排序,得到 \(a = [6, 2]\),这是一个非递增序列。
在第二个测试案例中,数组已经是非递增的,所以我们不需要移除任何整数。
思路:说了这么多,其实题意等价于问第一个是不是最大的数,枚举每一个数作为第一个,前面的要全删除,然后后面比这个数大的也要删除,这样子就可以保证排序到最后可以获得不递增的排列
不妨象想想,第一个数非最大数,且后面有更大数时是无解的

#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<deque>
#include<cctype>
#include<string.h>
#include<math.h>
#include<time.h>
#include<random>
#include<stack>
#include<string>
#define ll                                     long long
#define lowbit(x) (x & -x)
//#define endl "\n"//                           交互题记得删除
using namespace std;
mt19937 rnd(time(0));
const ll mod = 998244353;
ll ksm(ll x, ll y)
{
ll ans = 1;
while (y)
{
if (y & 1)
{
ans = ans % mod * (x % mod) % mod;
}
x = x % mod * (x % mod) % mod;
y >>= 1;
}
return ans % mod % mod;
}
ll gcd(ll x, ll y)
{
if (y == 0)
return x;
else
return gcd(y, x % y);
}
void fio()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
ll a[4500];
int main()
{fio();ll t;cin>>t;while(t--){ll n;cin>>n;for(ll i=1;i<=n;i++){cin>>a[i];}ll ans=9999999999;for(ll i=1;i<=n;i++){ll cnt=i-1;for(ll j=i+1;j<=n;j++){if(a[j]==a[i])continue;else if(a[j]>a[i])cnt++;}ans=min(ans,cnt);}cout<<ans<<endl;}
}

C. Add Zeros

您将获得一个最初包含 \(n\) 个整数的数组 \(a\)。在一个操作中,您必须执行以下操作:
选择一个位置 \(i\),使得 \(1 < i \leq |a|\)\(a_i = |a| + 1 - i\),其中 \(|a|\) 是数组的当前大小。
\(a\) 的末尾追加 \(i - 1\) 个零。
在您想要多次执行此操作后,数组 \(a\) 的最大可能长度是多少?
\(Input\)
每个测试包含多个测试用例。第一行包含测试用例的数量 \(t\)\(1 \le t \le 1000\))。测试用例的描述紧随其后。
每个测试用例的第一行包含 \(n\)\(1 \le n \le 3 \cdot 10^5\))——数组 \(a\) 的长度。
每个测试用例的第二行包含 \(n\) 个整数 \(a_1, a_2, \ldots, a_n\)\(1 \le a_i \le 10^{12}\))。
保证所有测试用例的 \(n\) 之和不超过 \(3 \cdot 10^5\)
\(Output\)
对于每个测试用例,输出一个整数 —— 在执行一系列操作后,数组 \(a\) 的最大可能长度。
\(Sample\)
4
5
2 4 6 2 5
5
5 4 4 5 1
4
6 8 2 3
1
1


10
11
10
1
样例解析:
在第一个测试用例中,我们可以先选择 \(i = 4\),因为 \(a_4 = 5 + 1 - 4 = 2\)。在此之后,数组变为 \([2, 4, 6, 2, 5, 0, 0, 0]\)。然后我们可以选择 \(i = 3\),因为 \(a_3 = 8 + 1 - 3 = 6\)。在此之后,数组变为 \([2, 4, 6, 2, 5, 0, 0, 0, 0, 0]\),其长度为 10。可以证明,没有任何操作序列会使最终数组更长。
在第二个测试用例中,我们可以选择 \(i=2\),然后 \(i=3\),然后 \(ii=4\)。最终数组将是 \([5, 4, 4, 5, 1, 0, 0, 0, 0, 0, 0]\),长度为 11。
思路:其实由这个式子\(a_i = |a| + 1 - i\)可得到\(a_i - i = |a| + 1\),当一个数可以进行操作时,其必然符合这个式子,不妨先求出\(a_i - i -|a| - 1\)作为特征值然后反过来用特征值去记录符合的下标,然后每次增加i-1时,可以去看看是否有符合的特征值存在,如果存在,则进行搜索,不在就返回。因为答案显然是没有一个固定策略可选,所以选择记忆化递归(dp的一种形式)然后从以0作为特征值去搜即可算出答案,对于每个阶段的增值可能最好用map记住,然后从其他地方搜过来时,时间复杂度就大大减小了

#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<deque>
#include<cctype>
#include<string.h>
#include<math.h>
#include<time.h>
#include<random>
#include<stack>
#include<string>
#define ll                                     long long
#define lowbit(x) (x & -x)
//#define endl "\n"//                           交互题记得删除
using namespace std;
mt19937 rnd(time(0));
const ll mod = 998244353;
ll ksm(ll x, ll y)
{
ll ans = 1;
while (y)
{
if (y & 1)
{
ans = ans % mod * (x % mod) % mod;
}
x = x % mod * (x % mod) % mod;
y >>= 1;
}
return ans % mod % mod;
}
ll gcd(ll x, ll y)
{
if (y == 0)
return x;
else
return gcd(y, x % y);
}
void fio()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
ll n;
map<ll,set<ll>>q;
map<ll,ll>op;
ll dfs(ll cnt,ll z)//记忆化?
{if(op[cnt]){return op[cnt]+z;}ll ans=z;for(auto j:q[cnt]){ans=max(ans,dfs(cnt+j-1,z+j-1));}op[cnt]=ans-z;return ans;
}
ll a[450000];
int main()
{fio();ll t;cin>>t;while(t--){op.clear();cin>>n;for(ll i=1;i<=n;i++){cin>>a[i];if(a[i]>=(n-i+1)&&i!=1){q[a[i]-(n-i+1)].insert(i);}}cout<<dfs(0,n)<<endl;q.clear();}
}

D1.The Endspeaker (Easy Version)

思路:先给个个人想法,用一维滚动数数组进行dp,dp[i]指dp到这位的最小费用,然后再每次数进行dp时进行双方更新,这种想法喜提WA3了,后面有时间再重新想想

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写高质量代码(手撕代码)

首先上几个面试题:(真难)1. 手写函数实现数组扁平化(只减少一级嵌套)思路:function flatten(arr) {let res = [];arr.forEach((item) => {if (Array.isArray(item)) {item.forEach((e) => res.push(e));} else {res.push(item);}});return res;}console.log(flatte…

LeetCode LCR135[报数]

LeetCode LCR135[报数]题目 链接 LeetCode LCR135[报数] 详情实例题解 思路 通过 pow 函数对10进行幂运算,来获取报数范围 然后循环遍历 通过 push_back 方法将数字加入到容器内 代码 class Solution { public:vector<int> countNumbers(int cnt) {vector<int> iR…

语音 AI 迎来爆发期,也仍然隐藏着被低估的机会丨RTE2024 音频技术和 Voice AI 专场

在人工智能快速发展的今天,语音交互技术正经历一场革命性的变革。从语音识别到语音合成,再到端到端的语音对话系统,这一领域的创新正以前所未有的速度推进。这些进步不仅提升了技术指标,更为实时翻译、虚拟数字人、智能客服等实时互动场景带来了新的可能。本届 RTE2024 大会…

节能攻略,AUTOSAR PN局部网络管理技术!

随着整车功能的不断演进,车上各类用电设备(控制器、执行机构、感知设备等)的用电功耗越来越大,为了降低整车能耗,国内外很多OEM及Tire1都在考虑相关的机制及方案,其中PN局部网络管理机制,以其简单、灵活的特点获得众多落地应用。 随着整车功能的不断演进,车上各类…

AUTOSAR解决方案 — INTEWORK-EAS-CP

INTEWORK-EAS-CP(ECU AUTOSAR Software)是经纬恒润自主研发的符合AUTOSAR标准的软件产品。解决方案涵盖了嵌入式标准软件、AUTOSAR工具链、集成服务和培训等各个方面的内容,旨在为国内的OEM和供应商提供稳定可靠、便捷易用的AUTOSAR平台。 随着汽车电子技术的发展,汽…

多校A层冲刺NOIP2024模拟赛19

讲个笑话: (讨论时间) huge:(叹气)这讨论啊,就是改不了,这换了铃声了,也没…… 众人:现在是讨论时间啊。 huge:(停顿)那刚才大课间那会哇啦哇啦的…… 图书管理 简要题意 给定一个长度为\(n(n\le 10^4)\)的排列,求\(\sum\limits_{l=1}^n\sum\limits_{r=l}^n[r-l为…

hive基础知识分享(二)

继续学习hive的相关知识写在前面 今天继续学习hive部分的知识。 以下是您提供的内容转成的 Markdown 格式: Hive 相关知识 hive中不同的 count 区别select clazz,count(distinct id) as cnt,count(*) as cnt,count(1) as cnt_1,count(id) as cnt_id from students group by cl…

Mysql数据库一

CREATE DATABASE 数据库名;//创建数据库 SHOW databases;//查看数据库列表 USE 数据库名;//选择数据库 DROP DATABASE 数据库名://删除数据库

做好网站后如何让这个网站被更多的人浏览查看?

许多人都有这样一个问题:做好自己的网站,如何让这个网站被更多的人浏览看,查看到呢?有人可能会说简单粗暴的方式:买百度排名,买广告排名。没错,这是一直最直接的方式,但问题是这里的成本还是比较多的,对于之前没有做过SEM的个人和企业来说,在哪里买,买多少合适,买多…

http server

我下载了 https://archive.apache.org/dist/httpd/httpd-2.4.62.tar.gz 请问如何解压配置一个apache server,并配置新增端口30000,转发到nginx 32020端口 ⚠️由于网站限制,Kimi 未能阅读这个网页中的要解压、配置Apache服务器,并设置端口转发到Nginx,你可以按照以下步骤操作…

重链剖分学习笔记

一、引入 学习一个新的数据结构或者算法前,我们都要了解其用途,毕竟用途才是其被发明出来的原因。那么树链剖分有什么用呢?它维护的是什么样的信息呢?这里我们只探讨重链剖分。树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息。 具体来说,将整棵树剖分为若干…