前言
看到这个标题,估计一群人又要开始躁动不安了……
等一下,如果是洛谷的管理员看到了这篇文章,不要把我给封了,我是在教各位刚入门的小萌新,也就是以后的神犇们如何切水题呢!本文没有任何反对洛谷的意思,坚决支持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);
//情况1
tot+=C(x+2,x+y-1)*C(n-x-3,n+m-x-y-1);//情况2
tot+=C(x-3,x+y-1)*C(n-x+2,n+m-x-y-1);//情况3
tot+=C(x,x+y-3)*C(n-x-3,n+m-x-y-3);//情况4
tot+=C(x-3,x+y-3)*C(n-x,n+m-x-y-3);//情况5
cout<<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);
//情况1
tot+=C(x+2,x+y-1)*C(n-x-3,n+m-x-y-1);//情况2
tot+=C(x-3,x+y-1)*C(n-x+2,n+m-x-y-1);//情况3
tot+=C(x,x+y-3)*C(n-x-3,n+m-x-y-3);//情况4
tot+=C(x-3,x+y-3)*C(n-x,n+m-x-y-3);//情况5
cout<<tot;
return 0;
}
对比也是十分的明显!
好了,这篇博客就水到这里,记得点个推荐,我们下次再见!
标签:洛谷,int,题解,ll,long,实用,include From: https://www.cnblogs.com/charzie-blog/p/18158427