普及模拟2 +【LGR-155-Div.3】洛谷基础赛 #3 &「NnOI」Round 2
普及模拟2
\(T1\) 地址 \(0pts\)
- 简化题意:判断一个 \(IP\) 地址是否合法(数据保证字符串中存在且仅存在4个被字符分开的整数),若不合法则将其改正。
- 部分分:
- \(0pts\) :输出
Yes
,不,可以,总司令。- 然鹅根本就没有输出合法的数据点
- \(0pts\) :输出
- 正解:
char s[100];
int main()
{
freopen("ip.in","r",stdin);
freopen("ip.out","w",stdout);
int len,i,sum=0,x=0,num=0,flag=0;
cin>>(s+1);
len=strlen(s+1);
s[len+1]='.';//赛时写成s[i+1]='.'了,挂了100pts
len++;
for(i=1;i<=len;i++)
{
if('0'<=s[i]&&s[i]<='9')
{
if(!('0'<=s[i-1]&&s[i-1]<='9'))
{
if('0'<=s[i+1]&&s[i+1]<='9')
{
if(s[i]=='0')
{
flag=1;
break;
}
}
}
x=x*10+s[i]-'0';
}
else
{
if(x>255||s[i]!='.')
{
flag=1;
break;
}
if(s[i]=='.')
{
num++;
}
if(num>=4)
{
flag=1;
break;
}
x=0;
}
}
if(flag==0&&num==3)
{
cout<<"YES"<<endl;
}
else
{
x=flag=0;
cout<<"NO"<<endl;
for(i=1;i<=len;i++)
{
if('0'<=s[i]&&s[i]<='9')
{
x=x*10+s[i]-'0';
flag=1;
}
else
{
if(flag==1)
{
sum++;
if(sum<=4)
{
cout<<min(x,255);
}
if(sum<=3)
{
cout<<".";
}
if(sum==4)
{
break;
}
}
x=flag=0;
}
}
}
return 0;
}
\(T2\) 内积 \(100pts\)
- 原题:SP1025 FASHION - Fashion Shows
- 考虑将数组 \(a,b\) 排序,此时的 \(\sum\limits_{i=1}^{n}=a_i b_i\) 即为所求。
- 前置知识:若 \(a_1<a_2,b_1<b_2\) ,有 \(a_1 b_1+a_2 b_2>a_1 b_2+a_2 b_1\) 。
- 证明:因为 \(a_1<a_2,b_1<b_2\) ,所以有 \(b_2-b_1>0,a_2-a_1>0\) ,故 \((a_2-a_1) (b_2-b_1)>0\) ,展开得 \(a_2 b_2-a_2 b_1-a_1 b_2+a_1 b_1>0\) ,移项得 \(a_1 b_1+a_2 b_2>a_1 b_2+a_2 b_1\) 。
#define ll __int128_t //赛时怕炸long long就开了int128,但不开int128也能过
ll read()
{
ll x=0,f=1;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-')
{
f=-1;
}
c=getchar();
}
while('0'<=c&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void write(ll x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
{
write(x/10);
}
putchar((x%10)+'0');
}
ll a[2000001],b[2000001];
int main()
{
freopen("nj.in","r",stdin);
freopen("nj.out","w",stdout);
ll n,i,ans=0;
n=read();
for(i=1;i<=n;i++)
{
a[i]=read();
}
for(i=1;i<=n;i++)
{
b[i]=read();
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
for(i=1;i<=n;i++)
{
ans+=a[i]*b[i];
}
write(ans);
return 0;
}
- 前置知识:若 \(a_1<a_2,b_1<b_2\) ,有 \(a_1 b_1+a_2 b_2>a_1 b_2+a_2 b_1\) 。
\(T3\) 翻转 \(10pts\)
- 原题:luogu P1764 翻转游戏 (加强版)
- 弱化版:luogu P2040 打开所有的灯
- 部分分:
- \(0pts\) :不可以,总司令。
- 然鹅根本就没有输出无解的数据点
- \(10pts\) :输出
0
。
- \(0pts\) :不可以,总司令。
- 正解:
- 观察到 \(1 \le n \le 16\) ,考虑爆搜。开两个数组 \(a,b\) 分别记录最终结果都为白色或都为黑色是否需要翻转(若值为 \(1\) 则需要翻转,值为 \(0\) 则不需要翻转)。考虑从左到右进行搜索,搜到第 \(n+1\) 列时切换到下一行,当搜到第 \(n+1\) 行判断当前状态是否可行。
- 当搜索到第 \(i\) 行,第 \(j\) 列的点时,只需要考虑第 \(i-1\) 行,第 \(j\) 列的点状态是否可行。因为对第 \(i\) 行,第 \(j\) 列进行翻转,对第 \(i-1\) 行产生影响的点仅有第 \(i-1\) 行,第 \(j\) 列的点,而且后续搜索时也不会影响到第 \(i-1\) 行,第 \(j\) 列的点。
int a[20][20],b[20][20],vis1[20][20],vis2[20][20],ans=0x7f7f7f7f;
int check1(int x,int y)
{
if(x==0||y==0)
{
return 0;
}
else
{
return (a[x][y]+vis1[x][y]+vis1[x-1][y]+vis1[x+1][y]+vis1[x][y-1]+vis1[x][y+1])%2;//(x,y)受到(x-1,y),(x+1,y),(x,y-1),(x,y+1)的影响,两次翻转会相互抵消所以模2
}
}
int check2(int x,int y)
{
if(x==0||y==0)
{
return 0;
}
else
{
return (b[x][y]+vis2[x][y]+vis2[x-1][y]+vis2[x+1][y]+vis2[x][y-1]+vis2[x][y+1])%2;
}
}
void dfs1(int x,int y,int num,int n)//num为翻转次数
{
if(num>=ans)//剪枝:如果当前操作次数大于或等于答案时直接return
{
return;
}
if(y==n+1)//当搜到第n+1列时,切换到下一行
{
x++;
y=1;
}
if(x==n+1)
{
for(int i=1;i<=n;i++)//判断当前状态
{
if(check1(n,i)==1)
{
return;//说明当前状态不合法
}
}
ans=min(ans,num);//进行转移
return;
}
vis1[x][y]=0;//将(x,y)不进行翻转
if(check1(x-1,y)==0)
{
dfs1(x,y+1,num,n);
}
vis1[x][y]=1;//将(x,y)进行翻转
if(check1(x-1,y)==0)
{
dfs1(x,y+1,num+1,n);
}
}
void dfs2(int x,int y,int num,int n)
{
if(num>=ans)
{
return;
}
if(y==n+1)
{
x++;
y=1;
}
if(x==n+1)
{
for(int i=1;i<=n;i++)
{
if(check2(n,i)==1)
{
return;
}
}
ans=min(ans,num);
return;
}
vis2[x][y]=0;
if(check2(x-1,y)==0)
{
dfs2(x,y+1,num,n);
}
vis2[x][y]=1;
if(check2(x-1,y)==0)
{
dfs2(x,y+1,num+1,n);
}
}
int main()
{
freopen("fz.in","r",stdin);
freopen("fz.out","w",stdout);
int n,i,j;
char pd;
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>pd;
if(pd=='b')
{
a[i][j]=1;
b[i][j]=0;
}
else
{
a[i][j]=0;
b[i][j]=1;
}
}
}
dfs1(1,1,0,n);
dfs2(1,1,0,n);
if(ans==0x7f7f7f7f)
{
cout<<"Impossible"<<endl;
}
else
{
cout<<ans<<endl;
}
return 0;
}
- 观察到 \(1 \le n \le 16\) ,考虑爆搜。开两个数组 \(a,b\) 分别记录最终结果都为白色或都为黑色是否需要翻转(若值为 \(1\) 则需要翻转,值为 \(0\) 则不需要翻转)。考虑从左到右进行搜索,搜到第 \(n+1\) 列时切换到下一行,当搜到第 \(n+1\) 行判断当前状态是否可行。
\(T4\) 阶乘 \(40pts\)
简化题意: \(T\) 组询问,每组询问给出 \(n\) ,求出所有满足 \(n=\dfrac{a!}{b!}\) 的 \(a,b\) 及数量或给出无解信息(输出
-1
)。赛时乱搞的一个算法:预处理 \(1 \sim 30\) 的阶乘,然后枚举右端点一直到 \(30\) ,接着枚举左端点,骗到了 \(40pts\) 。
正解:
- \(n=1\) 时,输出
-1
。 - \(n \in \mathbb{P}\) 时,仅存在一组答案 \(a=n,b=n-1\) 。
- 打表发现阶乘的增长速度极快,\(20! \approx 2 \times 10^{18}\) ,发现有 \(a-b \le 20\) ,枚举 \(d=a-b\) ,那么一定有 \(a^d \le n,b^d \ge n\) ,即 \(a \le \sqrt[d]{n},b \ge \sqrt[d]{n}\) (设 \(a(a+1)(a+2)(a+3)(a+4)=n\) ,有 \(a,a+1,a+2,a+3,a+4\) 均在 \(\sqrt[5]{n}\) 附近)。
priority_queue<pair<ll,ll> >q;
int main()
{
freopen("jc.in","r",stdin);
freopen("jc.out","w",stdout);
ll t,n,i,l,r,len,j,sum,ls;
scanf("%lld",&t);
for(i=1;i<=t;i++)
{
scanf("%lld",&n);
if(n==1)
{
printf("-1\n");
}
else
{
sum=0;
for(len=2;len<=20;len++)//如果枚举到20不放心,可以再大一点
{
for(r=pow(1.0*n,1.0/len);;r++)
{
l=r-len+1;
if(l!=1)//特判l=1的时候 ,此时有b=0,但是除数不能为0
{
ls=1;
for(j=l;j<=r;j++)//直接枚举阶乘就行,也可以事先预处理出阶乘
{
ls*=j;
}
if(ls>n)
{
break;
}
if(ls==n)
{
sum++;
q.push(make_pair(-r,-(l-1)));
break;
}
}
}
}
sum++;
q.push(make_pair(-n,-(n-1)));//因为枚举长度大于1,所以会漏掉a=n,b=n-1的情况
printf("%lld\n",sum);
for(j=1;j<=sum;j++)
{
printf("%lld %lld\n",-q.top().first,-q.top().second);
q.pop();
}
}
}
return 0;
}
- \(n=1\) 时,输出
【LGR-155-Div.3】洛谷基础赛 #3 &「NnOI」Round 2
这场比赛和上午模拟赛讲评时间重了,打完 \(T1,T2\) 就溜了。
\(T1\) luogu P9569 Khronostasis Katharsis \(100pts\)
- 水题
int main()
{
ll n,m,i,v,t,ans=0,l=1;//l要初始化为1(当T=1时),赛时在这里卡了10min
cin>>n>>m;
for(i=1;i<=n;i++)
{
cin>>v>>t;
if((m-t)*v>ans)
{
ans=(m-t)*v;
l=i;
}
}
cout<<l;
return 0;
}
\(T2\) luogu P9570 Glaciaxion \(100pts\)
- 水题
char s[1000001];
int main()
{
int n,m,i,flag=0,sumn=0,l=0,r=0;
char pd;
cin>>n>>m>>(s+1);
for(i=1;i<=m;i++)
{
if(s[i]=='N')
{
sumn++;
}
if(s[i]=='Y'&&sumn==0)
{
cout<<"No solution"<<endl;
flag=1;
break;
}
}
if(flag==0)
{
if(sumn>n)
{
cout<<"No solution"<<endl;
}
else
{
for(i=1;i<=m;i++)
{
if(s[i]=='N')
{
l++;
cout<<l<<" ";
}
if(s[i]=='Y')
{
cout<<"1 ";
}
}
}
}
return 0;
}
\(T3\) luogu P9571 Horizon Blue \(0pts\)
- 前置知识:两条直线只要 \(k\) 不同,这两条直线就会相交且只有一个公共点。
- \(map\) 大法好,开一个 \(map\) 记录 \(y=kx+b\) 的直线个数。令 \(len[i]\) 表示斜率为 \(i\) 的直线个数。
- 其他细节:考虑到 \(1 \le |k| \le 10^5\) ,事先给 \(k\) 加上一个大点的常数(eg: \(1000000\) ),防止出现负数。
int k[3000000],b[3000000],len[3000000];
map<pair<int,int>,int>a;
int main()
{
int n,i,j,pd,ans=0,x,y,m=0,sum=0,ls;//sum用来存储当前画板上直线的条数
cin>>n;
for(i=1;i<=n;i++)
{
cin>>pd>>x>>y;
x+=1000000;//防止出现负数
if(pd==1)
{
if(a[make_pair(x,y)]==0)
{
m++;
k[m]=x;
b[m]=y;
}
a[make_pair(x,y)]++;
len[x]++;
sum++;
}
if(pd==2)
{
cout<<sum-len[x]<<endl;//当前画板上直线的条数减去斜率为x的直线的条数即为答案
}
if(pd==3)
{
ls=m;
m=0;
for(j=1;j<=ls;j++)
{
if(k[j]!=x)//若当前画板上直线的斜率不为x,就将其抹去
{
len[k[j]]=0;
a[make_pair(k[j],b[j])]=0;
}
else//斜率为x的存回原数组
{
m++;
k[m]=k[j];
b[m]=b[j];
}
}
sum=len[x]-a[make_pair(x,y)];//抹去重合的直线
len[x]-=a[make_pair(x,y)];//抹去重合的直线
a[make_pair(x,y)]=0;//抹去重合的直线
}
}
return 0;
}
\(T4\) luogu P9572 Colorful Days♪ \(0pts\)
- 暂时咕了,有时间再打。
总结
- 上午模拟赛打到 \(8:50\) 就溜去打别的东西了,导致 \(T1\) 没有造出合理的 \(hack\) 数据,挂了 \(100pts\) 。
后记
- 众所周知,上午的 \(T3\) 有 \(4\) 个数据范围。
普及模拟2 +【LGR-155-Div.3】洛谷基础赛 #3 &「NnOI」Round 2的更多相关文章
- 洛谷 8 月月赛 & 「PMOI」Round · 04
T1 T166167 「PMOI-4」人赢 题目大意 给一个数列的前两项分别为\(n\)和\(m\) 当\(i\geq3\)时\(a_i = a_{i-1}*a_{i-2}\)的个位 给定\(n\), ...
- LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美
题目传送门:LOJ #2085. 两个月之前做的傻题,还是有必要补一下博客. 题意简述: 求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \( ...
- LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇
题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...
- 洛谷 4768 LOJ 2718「NOI2018」归程
[题解] 本题有多种做法,例如可持久化并查集.kruskal重构树等. kruskal重构树的做法是这样的:先把边按照海拔h从大到小的顺序排序,然后跑kruskal建立海拔的最大生成树,顺便建krus ...
- LOJ 2249: 洛谷 P2305: bzoj 3672: 「NOI2014」购票
题目传送门:LOJ #2249. 题意简述: 有一棵以 \(1\) 号节点为根节点的带边权的树. 除了 \(1\) 号节点的所有节点上都有人需要坐车到达 \(1\) 号节点. 除了 \(1\) 号节点 ...
- 洛谷比赛 「EZEC」 Round 4
洛谷比赛 「EZEC」 Round 4 T1 zrmpaul Loves Array 题目描述 小 Z 有一个下标从 \(1\) 开始并且长度为 \(n\) 的序列,初始时下标为 \(i\) 位置的数 ...
- 【LGR-(-8)】洛谷入门赛 #5 题解
比赛链接 9道题. 注:题目名称中链接为题目链接,题号中链接为比赛内链接 题目编号 洛谷题号 题目名称 题目难度 A P5713 [深基3.例5]洛谷团队系统 \(\color{red}{入门}\) ...
- 洛谷 P5345: 【XR-1】快乐肥宅
题目传送门:洛谷 P5345. 很荣幸为 X Round 1 贡献了自己的一题. 题意简述: 给定 \(n\) 组 \(k_i,g_i,r_i\)(\(0\le k_i,r_i<g_i\le 1 ...
- 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并
洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...
- 洛谷模拟NOIP考试反思
洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...
随机推荐
- Vue第一篇 ES6的常用语法
01-变量的定义 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Android之AMS原理分析
在学习android框架原理过程中,ams的原理非常重要,无论是在面试中还是在自己开发类库过程中都会接触到. 1 简述 ActivityManagerService是Android最核心的服务,负责管 ...
- Makefile中的+=、:=、?=
1.= "="是最普通的等号,然而在Makefile中确实最容易搞错的赋值等号,使用"="进行赋值,变量的值是整个makefile中最后被指定的值.不太容易理解 ...
- 用CI/CD工具Vela部署Elasticsearch + C# 如何使用
Vela 除了可以帮我们编译.部署程序,利用它的docker部署功能,也能用来部署其他线上的docker镜像,例如部署RabbitMQ.PostgreSql.Elasticsearch等等,便于集中管 ...
- 一个轻量快速的C++日志库
limlog 作一篇文章记录实现,驱动优化迭代. 代码仓库 用法 实现 后端实现 前端实现 日期时间的处理 线程id的获取 日志行的其他项处理 优化 整形字符串格式化优化 测试 benchmark 性 ...
- Mygin实现动态路由
本篇是Mygin的第四篇 目的 使用 Trie 树实现动态路由解析. 参数绑定 前缀树 本篇比前几篇要复杂一点,原来的路由是用map实现,索引非常高效,但是有一个弊端,键值对的存储的方式,只能用来索引 ...
- 不同数据库创建用户,数据库的SQL语句整理
不同数据库创建用户,数据库的SQL语句整理 MySQL mysql -uroot -p # 输入密码登录数据库 CREATE DATABASE IF NOT EXISTS xxxdata_somein ...
- Clickhouse 极简单机版本安装部署
Clickhouse 极简单机版本安装部署 摘要 Clickhouse的安装与部署其实比较简单. 但是为了能够更加简单的部署与使用. 尤其是能够可以方便的添加到镜像内进行运行. 所以记录一下方便快捷的 ...
- [转帖]Jmeter中如何读取MYSQL数据作为请求参数
在项目测试过程中,我经常需要将数据库中的数据作为参数传递到请求中.Jmeter中MYSQL数据库连接操作过程如下: 1.下载/n导入mysql的jdbc驱动包 下载mysql驱动包地址: http:/ ...
- [转帖]利用Python调用outlook自动发送邮件
↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 使用Python发送邮件有两种方式,一种是使用smtp调用邮箱的smtp服务器,另一种是直接调用程序直接发送邮件.而在outlo ...