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的人还差两次考试[现在是一次了]就要重新分配机房,不 ...
随机推荐
- jQuery组织后续事件 事件冒泡 事件委托 键被按下 批量操作 hover input 事件
1. jQuery绑定事件的方式 1. $('').click(function(){}) 2. $('').on('click', function(){}) 2. 阻止后续事件执行 1. retu ...
- spring启动流程 (2) Bean实例化流程
本文通过阅读Spring源码,分析Bean实例化流程. Bean实例化入口 上一篇文章已经介绍,Bean实例化入口在AbstractApplicationContext类的finishBeanFact ...
- 【一文秒懂】Ftrace系统调试工具使用终极指南
[一文秒懂]Ftrace系统调试工具使用终极指南 1.Ftrace是什么 Ftrace是Function Trace的简写,由 Steven Rostedt 开发的,从 2008 年发布的内核 2.6 ...
- JMS微服务开发示例(三)使用分布式锁和编写定时任务
分布式锁 在Controller当中,提供了分布式锁的功能,代码如下: class HelloworldController : MicroServiceControllerBase { static ...
- [转帖]RHEL/CentOS 7中的网络暨network.service与NetworkManager.service详解
在RHEL/CentOS 6及以前的版本中,网络功能是通过一系列网络相关的脚本文件实现,如/etc/init.d/network文件,及如下/sbin/if*文件等. [root@myserver ~ ...
- nexus的简单安装与使用
nexus的简单安装与使用 文件下载 官网上面下载文件比较麻烦, 得科学一些 https://www.sonatype.com/download-oss-sonatype 选择oss 开源版进行下载 ...
- Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑
Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑 摘要 本周研发同事反馈现场有一个问题. 客户使用mysql的数据库(Windows平台) 然后在多表union all 创建 ...
- [转帖]Java 平台调试体系
https://www.cnblogs.com/xiaojiesir/p/15652619.html Java 平台调试体系(Java Platform Debugger Architecture,J ...
- dmidecode 查看内存以及硬件信息
安装工具dmidecode 使用 1.查看内存槽及内存条 $ sudo dmidecode -t memory 2.查看内存的插槽数,已经使用多少插槽.每条内存多大 $ sudo dmidecode ...
- vue3中context.emit遇见的坑
场景描述 今天遇见一个问题 ,子组件向上抛出去的事件. 被执行了两次,原因是 context.emit('click', item.id) 你的事件名是click 将click更改为其他事件名称,就可 ...