题面

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. Docker,vs2019下 使用.net core创建docker镜像 遇到的一些问题

      步骤主要分为以下几步: 1.创建docker for linux 的.netcore 项目(vs 自动创建了dockerfile 如果没有需要自己创建在根目录下) 2.编译项目到指定目录下 3.b ...

  2. 【HTML】步骤进度条组件

    HTML步骤进度条 效果图 思路 分份: 有多少个步骤就可以分成多少分,每份宽度应该为100%除以步骤数,故以上效果图中的每份宽度应该为25%,每份用一个div. 每份: 每份中可以看成是三个元素,一 ...

  3. 深入理解 C++ 条件变量:为何 `wait` 钟爱 `std::unique_lock`?

    深入理解 C++ 条件变量:为何 wait 钟爱 std::unique_lock?在 C++ 多线程编程中,线程间的协调是一个核心挑战.我们经常需要一个线程等待某个条件满足(例如,等待任务队列非空, ...

  4. IDEA强制注册登录版本号:IntelliJ IDEA 2021.2.2

    建议采用 IntelliJ IDEA 2021.2.2 版本进行  Evaluate for free  试用 IntelliJ IDEA 2021.3.3  以前的版本可以不用注册登录idea账户, ...

  5. C#+Selenium+Nunit实现Web自动化demo

    1.新建Nunit工程 步骤如下: 打开Rider选择图示选项 使用Nuget安装对应库 2.编写代码 代码如下: using NUnit.Framework; using OpenQA.Seleni ...

  6. 创建bean对象的三种方式

    一.使用无参构造方法创建 二.使用静态工厂创建 三.使用实例工厂创建

  7. 🎀Idea序列图插件-SequenceDiagram Core

    简介 SequenceDiagram Core 是一个 IntelliJ IDEA 插件,它允许开发者直接在 IDE中创建和编辑序列图(Sequence Diagrams).序列图是 UML(统一建模 ...

  8. yolov8 框架自带模型体验页面

    简介 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类.物体检测和实例分割任务. YOLOv8 是一个 SOT ...

  9. Navicat Premiun已经停止工作

    与网易有道词典冲突.退出词典即可.

  10. 各式各样的console

    目录 知乎的console 百度的console B站的console 知乎的console 我很喜欢hire的文字样式. _____ _____ _____ _____ /\ \ /\ \ /\ \ ...