「实用」如何在洛谷上正确的抄题解

news/2024/5/5 16:23:24

前言

看到这个标题,估计一群人又要开始躁动不安了……

等一下,如果是洛谷的管理员看到了这篇文章,不要把我给封了,我是在教各位刚入门的小萌新,也就是以后的神犇们如何切水题呢!本文没有任何反对洛谷的意思,坚决支持kkk!

好了,进入今天的正题,“如何在洛谷上正确的抄题解”这个标题直接概括了文章的意思吧!今天,我们就以NOIP2002年的真题,也就是这道题为例,来讲一讲如何正确的抄题解并且不被管理员赐予屎黄名(暗示管理员)

复制会吧,粘贴也会吧?

我们随便打开一道题目的题解,就以这个人为例,这是TA的原代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll C(int m,int n)
{if(n<0 || m<0 || n<m)return 0;ll tot=1;for(int i=1;i<=m;i++){tot*=n-i+1;tot/=i;}return tot;
}
int n,m,x,y;
int rt[5][5]={
0,0,1,0,0,
0,0,1,1,0,
0,0,0,1,1};//我们记录下哪些节点作为起点时,可以从右边的口子出去,其中(2,2)为马的位置
int dw[5][5]={
{},
{},
1,1,0,0,0,
0,1,1,0,0,
0,0,1,0,0};//同理,哪些可以从下边口子出去
int main()
{cin>>n>>m>>x>>y;if(n-x<3 && m-y<3){x=n-x;y=m-y;}//为了不想把特判代码写两遍,如果终点离得太近就旋转180度,变成起点离得太近的情况if(x<3 && y<3){int nx=2-x;int ny=2-y;//起点相对于马的坐标而言的位置ll tot=0;tot+=C(n-x,m+n-x-y-3)*rt[nx][ny];//右边出去的方法数tot+=C(n-x-3,m+n-x-y-3)*dw[nx][ny];//同理cout<<tot;return 0;}ll tot=C(n,n+m);for(int i=-2;i<=2;i++)tot-=C(x-i,x+y)*C(n-x+i,n+m-x-y);//情况1tot+=C(x+2,x+y-1)*C(n-x-3,n+m-x-y-1);//情况2tot+=C(x-3,x+y-1)*C(n-x+2,n+m-x-y-1);//情况3tot+=C(x,x+y-3)*C(n-x-3,n+m-x-y-3);//情况4tot+=C(x-3,x+y-3)*C(n-x,n+m-x-y-3);//情况5cout<<tot;return 0;
}

可以看到TA是直接使用dp来做的,当然如果有些人嘴硬说什么复制粘贴不会啊什么的,你可以立刻冲上去打他一顿你可以耐心的教一教TA,毕竟谁还不是从那个时候过来的啊!

可以看到洛谷题解区中的代码块是没有直接全部复制选项的(虽然这没什么用),但是我们依然可以通过ctrl+cctrl+v来进行快速的复制与粘贴,所以你学废了吗?不要忘了点一个推荐帮忙推荐一下哦!

删除注释

你见过哪个人没有事干在自己做题的时候,还是那种简单题的时候写注释的吗?所以,想要在洛谷上正确的抄题解,还需要删除注释,不然的话一看就能看出来你是在抄题解,删完注释后,这个人的代码就变成了这样:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll C(int m,int n)
{if(n<0 || m<0 || n<m)return 0;ll tot=1;for(int i=1;i<=m;i++){tot*=n-i+1;tot/=i;}return tot;
}
int n,m,x,y;
int rt[5][5]={
0,0,1,0,0,
0,0,1,1,0,
0,0,0,1,1};
int dw[5][5]={
{},
{},
1,1,0,0,0,
0,1,1,0,0,
0,0,1,0,0};
int main()
{cin>>n>>m>>x>>y;if(n-x<3 && m-y<3){x=n-x;y=m-y;}if(x<3 && y<3){int nx=2-x;int ny=2-y;ll tot=0;tot+=C(n-x,m+n-x-y-3)*rt[nx][ny];tot+=C(n-x-3,m+n-x-y-3)*dw[nx][ny];cout<<tot;return 0;}ll tot=C(n,n+m);for(int i=-2;i<=2;i++)tot-=C(x-i,x+y)*C(n-x+i,n+m-x-y);tot+=C(x+2,x+y-1)*C(n-x-3,n+m-x-y-1);tot+=C(x-3,x+y-1)*C(n-x+2,n+m-x-y-1);tot+=C(x,x+y-3)*C(n-x-3,n+m-x-y-3);tot+=C(x-3,x+y-3)*C(n-x,n+m-x-y-3);cout<<tot;return 0;
}

看起来也是十分的赏心悦目~

终极优化:改码风

还记得这篇博客吗?根据他,我们可以进行最终优化!!!

最终版

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll C(int m,int n) {if(n < 0 || m < 0 || n < m) return 0;ll tot = 1;for(int i = 1; i <= m; ++ i) {tot *= n - i + 1;tot /= i;}return tot;
}
int n, m, x, y;
int rt[5][5] = {0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1};
int dw[5][5]={{ }, { },1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0};
int main() {cin >> n >> m >> x >> y;if(n - x < 3 && m - y < 3) {x = n - x;y = m - y;}if(x < 3 && y < 3) {int nx = 2 - x; int ny = 2 - y;ll tot = 0;tot += C(n - x, m + n - x - y - 3) * rt[nx][ny];tot += C(n - x - 3, m + n - x - y - 3) * dw[nx][ny];cout << tot;return 0;}ll tot = C (n, n + m);for(int i = -2; i <= 2 ; ++ i)tot -= C(x - i, x + y) * C(n - x + i, n + m - x - y);tot += C(x + 2, x + y - 1) * C(n - x - 3, n + m - x - y - 1);tot += C(x - 3, x + y - 1) * C(n - x + 2, n + m - x - y - 1);tot += C(x, x + y - 3) * C(n - x - 3, n + m - x - y - 3);tot += C(x - 3, x + y - 3) * C(n - x, n + m - x- y - 3);cout << tot;return 0;
}

原版

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll C(int m,int n)
{if(n<0 || m<0 || n<m)return 0;ll tot=1;for(int i=1;i<=m;i++){tot*=n-i+1;tot/=i;}return tot;
}
int n,m,x,y;
int rt[5][5]={
0,0,1,0,0,
0,0,1,1,0,
0,0,0,1,1};//我们记录下哪些节点作为起点时,可以从右边的口子出去,其中(2,2)为马的位置
int dw[5][5]={
{},
{},
1,1,0,0,0,
0,1,1,0,0,
0,0,1,0,0};//同理,哪些可以从下边口子出去
int main()
{cin>>n>>m>>x>>y;if(n-x<3 && m-y<3){x=n-x;y=m-y;}//为了不想把特判代码写两遍,如果终点离得太近就旋转180度,变成起点离得太近的情况if(x<3 && y<3){int nx=2-x;int ny=2-y;//起点相对于马的坐标而言的位置ll tot=0;tot+=C(n-x,m+n-x-y-3)*rt[nx][ny];//右边出去的方法数tot+=C(n-x-3,m+n-x-y-3)*dw[nx][ny];//同理cout<<tot;return 0;}ll tot=C(n,n+m);for(int i=-2;i<=2;i++)tot-=C(x-i,x+y)*C(n-x+i,n+m-x-y);//情况1tot+=C(x+2,x+y-1)*C(n-x-3,n+m-x-y-1);//情况2tot+=C(x-3,x+y-1)*C(n-x+2,n+m-x-y-1);//情况3tot+=C(x,x+y-3)*C(n-x-3,n+m-x-y-3);//情况4tot+=C(x-3,x+y-3)*C(n-x,n+m-x-y-3);//情况5cout<<tot;return 0;
}

对比也是十分的明显!

好了,这篇博客就水到这里,记得点个推荐,我们下次再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/24841.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[题解]CF61E Enemy is weak

CF61E Enemy is weak 如下图,第\(i\)行\(j\)列表示第\(j\)个数结尾,向前长度为\(i\)的逆序子序列个数。递推方式见下图。第一行全为\(1\)。 要填第\(2\)行的值,就往前找所有\(>\)当前元素的位置,把它们第\(1\)行的值加起来。 要填第\(3\)行的值,就往前找所有\(>\)当…

Visual Studio 项目发布时将资源目录文件夹所有文件拷贝到发布路径

1.背景 在 .NET 项目开发过程中,时常需要将资源文件夹复制到生成目录,以确保这些资源随项目输出。 2.方法找到当前项目例如:xxxxx.Api 双击 进入,对 .csproj文件内容 ,加入如下信息:<Target Name="CopyResourcesPublish" AfterTargets="Publish"…

04、数据保护技术

数据保护技术 1.磁盘镜像制作 1.1.Windows 磁盘镜像制作及恢复 GetData Forenisc Imager 该工具安装后,可将安装后的文件复制出来(类似绿色运行) 使用(需要管理员运行):https://getdataforensics.com/product/fex-imager/DataNumen Disk Image 1.2.Linux 磁盘镜像制作(命…

visualstudio着色器设计器shadergraph使用

第一次使用着色器设计器。 vs的着色器设计器是hlsl的着色器设计器。不得不说里面节点得翻译是一坨屎。 附一个光线于法向量夹角渲染的设计图

linux系统管理

1.用户、用户组 创建用户 useradd [-g -d] 用户名 选项:-g指定用户的组,不指定-g,会创建同名组并自动加入,指定-g需要组已经存在,如已存在同名组,必须使用-g 选项:-d指定用户HOME路径,不指定,HOME目录默认在:/home/用户名 删除用户 userdel [-r] 用户名 选项:-r,删…

探索飞行奥秘:3D模型带你走进飞机涡轮发动机的世界

飞机涡轮发动机3D模型不仅是对真实发动机的精准复制,更是科技与艺术的完美结合。每一个细节都经过精心打磨,无论是复杂的叶片结构、精致的燃烧室,还是精密的控制系统,都让人叹为观止。仿佛置身于真实的发动机内部,感受着那股强大的力量从心底涌起。在浩瀚的蓝天下,飞机如…