2023年多校联训NOIP层测试1
2023年多校联训NOIP层测试1

T1 luogu P6882 [COCI2016-2017#3] Imena \(50pts\)
- 赛场上被如何输入和判断是否合法薄纱了,赛后发现还有数字这一说,而且原题面也没看懂(还是我太拉了)。
- 打这题时把语音选成C了,然后 \(CE\) 困惑了我和@wangyunbiao 好一阵子。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
string s;
int main()
{
int n,i,flag=0,ans=0,sum=0,len;
cin>>n;
while(sum<n)
{
cin>>s;//cin貌似读不进空格 利用这个进行读入
flag=0;
len=s.size();
if('A'<=s[0]&&s[0]<='Z')
{
flag=1;
}
for(i=0;i<=len-1;i++)
{
if(i>=1)
{
if('A'<=s[i]&&s[i]<='Z')//记得特判是否存在多个大写字母
{
flag=0;
break;
}
}
if('0'<=s[i]&&s[i]<='9')//如果有数字一定是不合法的
{
flag=0;
break;
}
}
if(flag==1)
{
ans++;
}
if(s[len-1]=='.'||s[len-1]=='?'||s[len-1]=='!')//如果到达末尾就输出
{
cout<<ans<<endl;
ans=flag=0;
sum++;
}
}
return 0;
}
T2 COCI 2016/2017 Round #3 Pohlepko \(6pts\)

- 400w的string用来记录每条路径的结果可真有我的,成功 \(MLE\) 。
- 分析样例,易知正方形对角线上的点横纵坐标之和相等,例如对角线②上的点横纵坐标之和为 \(2+1=1+2=3\) ,对角线③上的点横纵坐标之和为 \(3+1=2+2=1+3=4\) 。

- 由 \((1,1)\) 到达 \((n,m)\) 易证需要经过 \(n+m-1\) 个点。
- 考虑枚举第 \(i (2≤i≤n+m-1)\) 条对角线,遍历点 \((j,i-j+1)\) ,判断上个点( \((j-1,i-j+1) or (j,i-j)\) )是否可进行扩展,即能到达点 \((j,i-j+1)\) ,并于其中选出字典序最小的(如果有多个则都进行标记,直到找到相对唯一最小的或到达终点),标记这些位置是可进行扩展的。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
char a[2001][2001],minn;
int vis[2001][2001];//vis[x][y]用来记录点(x,y)是否可以进行扩展
int main()
{
int n,m,i,j,k;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
cout<<a[1][1];
vis[1][1]=1;
for(i=2;i<=n+m-1;i++)//枚举对角线
{
minn='z';
for(j=1;j<=n;j++)//枚举点
{
k=i+1-j;
if(1<=k&&k<=m)//判断点是否合法
{
if(vis[j-1][k]==1)//找到最小值
{
minn=min(minn,a[j][k]);
}
if(vis[j][k-1]==1&&a[j][k]<minn)//找到最小值
{
minn=min(minn,a[j][k]);
}
}
}
cout<<minn;//输出最小字母
for(j=1;j<=n;j++)
{
k=i+1-j;
if(1<=k&&k<=m)
{
if(vis[j-1][k]==1&&a[j][k]==minn)//进行扩展
{
vis[j][k]=1;
}
if(vis[j][k-1]==1&&a[j][k]==minn)//进行扩展
{
vis[j][k]=1;
}
}
}
}
return 0;
}
T3 luogu P7535 [COCI2016-2017#4] Kas \(15pts\)
- 发现这道题和学校oj上某年CSP-J模拟赛T2很像,不过那道题要求差值尽可能小,故令 \(sum=\sum\limits_{i=1}^{n} v[i]\) ,构建容量为 \(\frac{sum}{2}\) 的 \(01\) 背包,且每件物品的质量和价值相等(即 \(w[i]=v[i]\) )。但本题要求差值为 \(0\) 。
- 考虑 \(DP\) ,令 \(f[i][j]\) 表示前 \(i\) 张钞票分给两人后满足差值为 \(j\) 的最大总金额(不用管如何分配,赛场上因为这个考虑太多所以祭了)。
- 然后当遍历到第 \(i\) 张钞票进行分类讨论:
- 第 \(i\) 张钞票两人都不给,此时有 \(f[i][j]=f[i-1][j]\) 。
- 将第 \(i\) 张钞票给两人中金额少的那人,此时有 \(f[i][j]=max(f[i][j],f[i-1][j+a[i]]+a[i])\) 。
- 将第 \(i\) 张钞票给两人中金额多的那人,此时有 \(f[i][j]=max(f[i][j],f[i-1][abs(j-a[i])]+a[i])\) 。
- 注意是 \(abs(j-a[i])\) ,因为原来的差值可能是 \(j-a[i]\) ,也可能是 \(a[i]-j\) 。
- 得到 \(DP\) 式子, \(f[i][j]=max\lbrace f[i-1][j],f[i-1][j+a[i]]+a[i],f[i-1][abs(j-a[i])]+a[i]\rbrace\) 。
- 因为转移第一维时仅需要从上一维进行转移,可以加滚动数组优化,以此达到时间换空间的做法。
- 代码
//不加滚动数组
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
int a[502],f[502][100002];
int main()
{
int n,i,j,sum=0;
cin>>n;
memset(f,-0x3f,sizeof(f));//给f数组赋一个很小的值
f[0][0]=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
for(i=1;i<=n;i++)
{
for(j=0;j<=sum;j++)
{
f[i][j]=max(f[i-1][j],max(f[i-1][j+a[i]]+a[i],f[i-1][abs(j-a[i])]+a[i]));
}
}
cout<<sum-f[n][0]+f[n][0]/2;//(sum-f[n][0])*2/2+f[n][0]/2
return 0;
}
//使用滚动数组
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
int a[502],f[100002],g[100002];
int main()
{
int n,i,j,sum=0;
cin>>n;
memset(f,-0x3f,sizeof(f));
f[0]=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
for(i=1;i<=n;i++)
{
for(j=0;j<=sum;j++)
{
g[j]=max(f[j],max(f[j+a[i]]+a[i],f[abs(j-a[i])]+a[i]));//取一个g数组用来临时存储转移结果
}
for(j=0;j<=sum;j++)
{
f[j]=g[j];
}
}
cout<<sum-f[0]+f[0]/2;
return 0;
}
- 然后当遍历到第 \(i\) 张钞票进行分类讨论:
T4 CF1301F Super Jaber \(10pts\)
- 赛场上咕了,暴力建边,跑了一遍 \(Floyd\) ,骗了 \(10pts\) ,就去弄别的了。骗分代码
- 题面翻译得不太好,包括但不限于“并排相邻”,明显机翻痕迹。
- 考虑记录同种颜色的点的坐标,然后跑 \(BFS\) 处理多源最短路。
- 把相同颜色的点看做一个传送门。
- 令 \(dis[i][x][y]\) 表示以颜色为 \(i\) 的任意非 \((x,y)\) 点作为起点到达 \((x,y)\) 的最小距离,并开一个 \(vis\) 数组标记是否走过。
- 接着跑 \(BFS\) 预处理,实现 \(O(1)\) 查询。
- 时间复杂度 \(O(nm+nmk+qk)\) ,卡常代码(注释也在这里)。
- \(CF\) 上时限 \(5s\) ,不卡常代码跑到了 \(4.5s\) ,所以"略带"卡常,然后就手写了 \(queue\) ,加上了火车头和快读(请使用 C++11 或更高的版本编译), \(i++\) 改成了 \(++i\) ,尽量减少对数组的调用及变量重复定义消耗的时间,使用 \(bool\) 代替 \(int\) ,在主函数内使用 \(register \ int\) 。
- 卡常跑进 \(0.96s\) 以内了,有更优卡常方法@我。

- 代码(把快读快写部分删了)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
struct sx_queue//手写队列
{
int q[2000000],l=1,r=1;
inline void push(int x){q[++r]=x;}
inline int front(){return q[l+1];}
inline void pop(){++l;}
inline int back(){return q[r];}
inline int size(){return r-l;}
inline bool empty(){return l>=r;}
};
int main()
{
int n,m,k,q,nx,ny,r1,c1,r2,c2,ans,lsx,lsy,lsc,i,j;
cin(n,m,k);
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
cin(color[i][j]);
++sum[color[i][j]];
x[color[i][j]].push_back(i);
y[color[i][j]].push_back(j);
}
}
for(i=1;i<=k;++i)
{
sx_queue qx,qy;
memset(vis,false,sizeof(vis));
vis[i]=true;
for(j=0;j<sum[i];++j)
{
qx.push(x[i][j]);
qy.push(y[i][j]);
dis[i][x[i][j]][y[i][j]]=1;
}
while(!qx.empty())//跑一遍BFS
{
lsx=qx.front();
qx.pop();
lsy=qy.front();
qy.pop();
for(j=0;j<=3;++j)
{
nx=dir[j][0]+lsx;
ny=dir[j][1]+lsy;
if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&(!dis[i][nx][ny]))//这里用来处理颜色连通情况
{
qx.push(nx);
qy.push(ny);
dis[i][nx][ny]=dis[i][lsx][lsy]+1;
}
}
lsc=color[lsx][lsy];
if(!vis[lsc])
{
vis[lsc]=true;
for(j=0;j<sum[lsc];++j)
{
if(!dis[i][x[lsc][j]][y[lsc][j]])
{
qx.push(x[lsc][j]);
qy.push(y[lsc][j]);
dis[i][x[lsc][j]][y[lsc][j]]=dis[i][lsx][lsy]+1;
}
}
}
}
}
cin(q);
for(i=1;i<=q;++i)
{
cin(r1,c1,r2,c2);
ans=abs(r2-r1)+abs(c2-c1);//如果不经过传送门,易知结果为两点的曼哈顿距离
for(j=1;j<=k;++j)
{
ans=min(ans,dis[j][r1][c1]+dis[j][r2][c2]-1);//-1是因为重复计算一个点
}
cout(ans,'\n');
}
return 0;
}
总结
看清语言再提交。
2023年多校联训NOIP层测试1的更多相关文章
- Contest1893 - 2019年6月多校联训b层测试1
传送门 密码:waxadyt T1 暴力 对于任意相邻的两个值 中间能到达的最大高度是固定的 加上头尾,判一下就好了 代码//感谢Th Au K #include<bits/stdc++.h&g ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
- 三校联训 【NOIP模拟】寻找
题面 “我有个愿望,我希望穿越一切找到你.” 这是个二维平面世界,平面上有n个特殊的果实,我从(0,0)点出发,希望得到尽量多的果实,但是出于某种特殊的原因,我的运动方式只有三种(假设当前我在(x,y ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
- [k8s]nginx-ingress配置4/7层测试
基本原理 default-backend提供了2个功能: 1. 404报错页面 2. healthz页面 # Any image is permissable as long as: # 1. It ...
- 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】
[题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...
随机推荐
- 一文看完String的前世今生,内容有点多,请耐心看完!
写在开头 String字符串作为一种引用类型,在Java中的地位举足轻重,也是代码中出现频率最高的一种数据结构,因此,我们需要像分析Object一样,将String作为一个topic,单独拿出来总结, ...
- java基础-java面向对象01-day08
1. 一个简单的类 认识类 成员变量 类方法 public class Person { //类的成员变量 int age; String name; double height; double we ...
- 每天学五分钟 Liunx 000 | 计算机与 Liunx
计算机 计算机是具有数据处理与逻辑运算的机器. 它有输入单元,输出单元,CPU 内部的控制单元,逻辑处理单元以及内存组成. 输入单元如鼠标键盘等输入设备: 输出单元如打印机,显示屏,等输出 ...
- c#(nanoframework)安装单片机环境;如何使用c#写类似于c的单片机驱动
.NET nanoFramework 安装教程 准备材料 esp32单片机(支持wifi蓝牙) 安卓数据线(需要支持传输) 注意!请先安装esp32驱动程序 ESP32驱动链接 安装 .NET n ...
- 11-verilog-有限状态机
有限状态机 写RTL的时候,实现一个功能的时候有很多种方法 将系统划分为多个状态,状态之间有状态的转移,第一步,第二步......形成有限状态机 流水线技术设计,从输入到输出有多个步骤,多个步骤可以并 ...
- CSS : object-fit 和 object-position实现 图片或视频自适应
img { width: 100%; height: 300px; object-fit: cover; ...
- [转帖]ntp和chrony
https://www.cnblogs.com/hiyang/p/12682234.html#:~:text=chrony%20%E7%AE%80%E4%BB%8B%20chrony%20%E6%98 ...
- RPM安装的Oracle19c 修改init.ora进行修复以及最简单开机启动Oracle的方法
RPM安装的Oracle19c 修改init.ora进行修复以及最简单开机启动Oracle的方法 背景 今天开始使用自己心的ThinkBook14 的笔记本 因为已经没有了 Linux测试环境供我使用 ...
- 使用buildx在x86机器上面编译arm64架构的Docker镜像
buildx 多架构编译 安装docker 下载docker 下载buildx 安装架构支持 docker run --privileged --rm tonistiigi/binfmt --inst ...
- 解决Word等打开嵌入的文件提示 包含有害内容 无法打开的问题
最近打开文件时提示: 从网上找了一下 最简单的解决办法是: 新建一个文件, 输入如下内容 导入注册表 每次打开时不进行 文件有效性的检查即可. 为了省事 我多加了几个版本的 如果是excel 将 w ...