题面

T1 地址

Meaning

给定一个字符串,判断是否合法。若不合法,则将其变为合法字符串。

Solution

情况较少,直接枚举每个字符判断。实现时应注意:

  1. 题目强调了数据保证字符串中存在且仅存在 \(4\) 个被字符分开的整数,也就是说,可以利用数的连续性缩小分支结构。
  2. 注意判断是否所有的 . 都合法,放在最后不合法。
代码
#include<bits/stdc++.h>
using namespace std;
char a[100],ans[100];
int n,tem,cnt;
bool flag;
stack<int> st;
inline void pus(int x){
while(x%10!=x){
st.push(x%10);
x=x/10;
}
++cnt;
ans[cnt]=x+'0';
while(!st.empty()){
++cnt;
ans[cnt]=st.top()+'0';
st.pop();
}
}
int main(){
freopen("ip.in","r",stdin);
freopen("ip.out","w",stdout);
scanf("%s",a);
int n=strlen(a);
for(int i=0;i<n;++i){
if(a[i]>='0'&&a[i]<='9'){
if(a[i]=='0'&&(!tem)) flag=1;
while(a[i]>='0'&&a[i]<='9'){
tem=tem*10+a[i]-'0';
++i;
}
--i;
if(tem>255){
flag=1;
pus(255);
tem=0;
}else{
pus(tem);
tem=0;
}
++cnt;
ans[cnt]='.';
}else if(a[i]!='.'){
flag=1;
}
}
if(a[n-1]=='.') flag=1;
if(flag==1) printf("NO\n");
else return printf("YES\n"),0;
for(int i=1;i<cnt;++i) printf("%c",ans[i]);
return 0;
}

T2 内积

Meaning

给定两个数组,使两个不同数组数组中的元素相乘,求所有元素求积后积的最大和。

Solution

可以看作是一个数组表示一组值,另一个数组表示贡献。对于每个值,从贡献数组中匹配一个该值的贡献。可得对于越大的值,我们希望它做的贡献也越大。

可以将两个数组按相同的方式(同为升序或同为降序)排序,让两数组中同为第 \(k\) 大的数相乘求积之和。

代码
#include<bits/stdc++.h>
using namespace std;
long long n,a[2000000],b[2000000],ans;
int main(){
freopen("nj.in","r",stdin);
freopen("nj.out","w",stdout);
scanf("%lld",&n);
for(int i=0;i<n;++i) scanf("%lld",&a[i]);
for(int i=0;i<n;++i) scanf("%lld",&b[i]);
sort(a,a+n);
sort(b,b+n);
for(int i=0;i<n;++i) ans+=a[i]*b[i];
printf("%lld",ans);
return 0;
}

T3 翻转

Meaning

给定一个只含 \(0,1\) 的矩阵,每次可以改变一个位置和它上,下,左,右四个位置上的值,求是否可以使该矩阵上的所有值变为相同的数。若可以,则求出所需最小的改变次数。

Solution

数据范围很小,可以考虑深搜或枚举。

假设要把所有值变为 \(y\),且有

\[\operatorname{opp}_i= \begin{cases}0 &(i=1)\\1&(i=0) \end{cases}
\]

对于矩阵 \(a\),如果 \(a_{i,j}\ne{y}(i\ne{n})\),那么为了保证这一行的状态,使 \(a_{i,j+1}\leftarrow{\operatorname{opp}_{a_{i,j+1}}}\) 或 \(a_{i,j-1}\leftarrow{\operatorname{opp}_{a_{i,j-1}}}\) 会不断破环这一行的某个元素,就需要使 \(a_{i+1,j}\leftarrow{\operatorname{opp}_{a_{i+1,j}}}\)。以此类推,到最后一行时,如果还存在 \(a_{n,i}\ne{y}\) 则因继续改变 \(a_{n,i}\) 需要破坏上方状态而可以断定这种状态下不存在合法改变方式。

下图展示了一种情况:

可以用深搜枚举第一列的状态,复杂度为 \(O(2^n)\),再进行上述操作,复杂度为 \(O(n^2)\)。

代码
#include<bits/stdc++.h>
using namespace std;
bool a[20][20],tem[20][20];
char ch;
int n,minn=0x3f3f3f3f,dir[2][5]={{0,0,0,1,-1},{0,1,-1,0,0}};
inline void flip(int x,int y){
for(int i=0;i<5;++i){
if(tem[x+dir[0][i]][y+dir[1][i]]==1) tem[x+dir[0][i]][y+dir[1][i]]=0;
else tem[x+dir[0][i]][y+dir[1][i]]=1;
}
}
inline void act(int* x,int y){
int step=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j) tem[i][j]=a[i][j];
}
for(int i=1;i<=n;++i){
if(tem[1][i]!=x[i]){
flip(1,i);
++step;
}
}
for(int i=1;i<n;++i){
for(int j=1;j<=n;++j){
if(tem[i][j]!=y){
++step;
flip(i+1,j);
}
}
}
for(int i=1;i<=n;++i) if(tem[n][i]!=y) return;
minn=min(minn,step);
}
inline void dfs(int* arr,int x,int y){
if(x>n){
act(arr,1);
act(arr,0);
return;
}
int *c=arr;
c[x]=y;
dfs(c,x+1,1);
dfs(c,x+1,0);
}
int main(){
freopen("fz.in","r",stdin);
freopen("fz.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
ch=getchar();
while(ch<'a'||ch>'z') ch=getchar();
if(ch=='b') a[i][j]=1;
else a[i][j]=0;
}
}
int b[20];
dfs(b,1,1);
dfs(b,1,0);
if(minn==0x3f3f3f3f) printf("Impossible");
else printf("%d",minn);
return 0;
}

T4 阶乘

Meaning

给定一个数 \(n\),求满足 \(\frac{a!}{b!}=n\) 的数对 \((a,b)\) 的个数。

Solution

枚举复杂度过高,需要优化。

由于 \(\frac{a!}{b!}=\begin{matrix} \prod_{i\in[a+1,b]} i \end{matrix}\),所以当 \(len=b-a\) 时,可得:

  1. \(a^{len}<n\),即 \(a<\sqrt[len]{n}\),因为当 \(i\in[a+1,b]\) 时,\(a<i\)。
  2. \(b^{len}\geq{n}\),即 \(b\geq\sqrt[len]{n}\),因为当 \(i\in[a+1,b]\) 时,\(b\geq{i}\)。
  3. \(1\leq{len}<20\),根据数据范围即可得到(\(10^{18}<20!\))。

    我们可以根据以上结论直接优化枚举。
代码
#include<bits/stdc++.h>
using namespace std;
long long cases,n;
priority_queue<pair<long long,long long>,vector<pair<long long,long long> >,greater<pair<long long,long long> > > pq;
inline long long read(){
char ch=getchar();
long long x=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}
inline long long binpow(long long x,long long y){
long long ans=1;
while(y>0){
if(y&1==1) ans*=x;
x*=x,y>>=1;
}
return ans;
}
int main(){
freopen("jc.in","r",stdin);
freopen("jc.out","w",stdout);
cases=read();
while(cases--){
n=read();
if(n==1){
printf("-1\n");
continue;
}
pq.push({n,n-1});
for(long long l=2;l<20;++l){
for(long long i=powl(n,(double)1/l)-l;i<=powl(n,(double)1/l);++i){
if(i<=0) continue;
int j=i+l;
long long tem=1;
for(int k=i+1;k<=j;++k){
tem*=k;
if(tem>n) goto placea;
}
if(tem==n) pq.push({j,i});
placea:;
}
}
printf("%lld\n",pq.size());
while(!pq.empty()){
printf("%lld %lld\n",pq.top().first,pq.top().second);
pq.pop();
}
}
return 0;
}

Aug. 2023 普及组模拟赛 2的更多相关文章

  1. ZROI 普及组模拟赛02总结

    ZROI 普及组模拟赛02总结 先放[网址][http://zhengruioi.com/contest/96] 可能是有一段时间没有打这种正式的比赛了,今天打的很奇怪... T1 模拟水题 既然是普 ...

  2. 2017.1.16【初中部 】普及组模拟赛C组总结

    2017.1.16[初中部 ]普及组模拟赛C组 这次总结我赶时间,不写这么详细了. 话说这次比赛,我虽然翻了个大车,但一天之内AK,我感到很高兴 比赛 0+15+0+100=115 改题 AK 一.c ...

  3. NOIP2018普及组模拟赛

    向老师给的模拟赛,还没普及组难... 题目在洛谷团队里. 第一试三道水题,我46分钟就打完了,然后就AK了. 第二试一看,除了第二题要思考一段时间之外,还是比较水的,但是我得了Rank倒1,115分. ...

  4. nowcoder(牛客网)普及组模拟赛第一场 解题报告

    蒟蒻我可能考了一场假试 T1 绩点 这题没什么好说的,应该是只要会语言的就会做. T2 巨大的棋盘 一个模拟题吧qwq,但是要注意取模的时候先加上n或者m再取模,要不然会错的. #include< ...

  5. 【有奖】NOIP普及组模拟赛 个人邀请赛 乐多赛

    题目描述 日本数学家角谷有一个猜想:任意一个自然数,经过以下过程,最终会得到1.现在请你打印出任意一个数使用角谷猜想转换为1需要几次. 演变方式: 1.如果这个数为奇数,则将它×3+1.如果这个数为偶 ...

  6. 52-2018 蓝桥杯省赛 B 组模拟赛(一)java

    最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 313133131 ...

  7. ZROI提高组模拟赛05总结

    ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...

  8. NOIP2017提高组 模拟赛15(总结)

    NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...

  9. NOIP2017提高组 模拟赛13(总结)

    NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...

  10. NOIP2017提高组模拟赛 10 (总结)

    NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...

随机推荐

  1. 【踩坑系列】使用httpclient调用第三方接口返回javax.net.ssl.SSLHandshakeException异常

    1. 踩坑经历 最近做了个需求,需要调用第三方接口获取数据,在联调时一直失败,代码抛出javax.net.ssl.SSLHandshakeException异常, 具体错误信息如下所示: javax. ...

  2. verilog实现32位有符号流水乘法器

    verilog实现32位有符号流水乘法器 1.4bit乘法流程 1.无符号X无符号二进制乘法器 以下为4bit乘法器流程(2X6) 0 0 0 0 0 0 1 0 (2) X 0 0 0 0 0 1 ...

  3. Ollama本地部署大模型总结

    日拱一卒,功不唐捐 今天计划对之前ollama系列做个回顾,从如何部署到API使用,整理到一篇内容中,提供给大家参考. 安装指南 第一步:安装ollama 我们可以从官网下载ollama,此步骤支持w ...

  4. MongoDB导出/导入操作

    1.从测试环境数据库导出数据 2.导入数据到本地数据库 mongoimport --host localhost --port 27017 --username root --password 123 ...

  5. Spring Boot 根据配置决定服务(集群、单机)是否使用某些主件

    比如:在集群模式下,我想用 Nacos 组件,单机版不想用它. server: name: VipSoft Server Dev port: 8193 cloud: nacos: discovery: ...

  6. 掌握Tortoise-ORM高级异步查询技巧

    title: 掌握Tortoise-ORM高级异步查询技巧 date: 2025/04/22 12:05:33 updated: 2025/04/22 12:05:33 author: cmdrago ...

  7. VC6.0工具下载安装

    公众号回复:'VC6.0'

  8. 【笔记】Excel 2021|VBA删除数组中的一个元素、循环时删除一行、选择一列删除指定一行

    主要问题是循环的时候删除一行比较麻烦,因为删除了一行后,循环仍然直接访问后一行,会导致一定的异常. 文章目录 选择一列,删除指定一行 删除数组中的一个元素 方法1:利用动态数组,在循环中条件判断删除 ...

  9. 【BUG】vite build、Flask运行后报错Failed to load module script. Strict MIME type checking is enforced

    解决方案来源于Stack Overflow. 翻译来源于javascript - Python Flask - 错误 : "Failed to load module script. Str ...

  10. 【记录】博客|Markdown写作常用的符号表示、公式写法合集

    文章目录 基础内容Basic 1.符号合集 2.LaTeX公式输入 附加内容Addition 1.公式左对齐 2.Markdown文档导出的PDF分页 基础内容Basic 1.符号合集 LATEX M ...