前言
看到这个标题,估计一群人又要开始躁动不安了……
等一下,如果是洛谷的管理员看到了这篇文章,不要把我给封了,我是在教各位刚入门的小萌新,也就是以后的神犇们如何切水题呢!本文没有任何反对洛谷的意思,坚决支持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+c
及ctrl+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;
}
对比也是十分的明显!
好了,这篇博客就水到这里,记得点个推荐,我们下次再见!