• 个人简介

    取得棕名的方法

    首先,我们要知道一般有什么方法在比赛中取得棕名?

      1. 与他人代码重复度过高
      1. 涉嫌使用 AI 代码

    在你并没有小号的情况下,这其中显然是第 22 种方案会更优秀。不仅成功率高,而且不会波及他人,引起不必要的争端。即使有小号,采用第 22 种方法也未尝不优秀。

    具体实现

    接下来,我将拆出每一部分单独讲。

    Part 1 使自己的代码接近人机

    1. 代码格式化

    如果您的码风已经是格式化的,请自行跳过

    值得注意的是,AI 的缩进是以 tab 长度为单位的。而 for 循环的花括号必然加上。花括号必然压行,但会选择留下一个空格。

    这些工作大部分可以选择让 ctrl+shift+a 来实现,如下是我在校内模拟赛中的一份代码。与我的码风略有不同,是为了说明它的强大。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int n,s,k,now[49],a[49],ans1=1e15,ans2;
    void dfs(int p,int now,int res)
    {
    	if(p==k+1)
    	{
    		ans1=min(ans1,res);
    		ans2=max(ans2,res);
    		return;
    	}
    	if(!now) res-=a[p];
    	else res+=a[p];
    	if(res>n||res<0) return;
    	dfs(p+1,0,res);
    	dfs(p+1,1,res);
    }
    signed main()
    {
    	freopen("submarine.in","r",stdin);
    	freopen("submarine.out","w",stdout);
    	cin>>n>>s>>k;
        if(n>100000){
    cout<<0<<" "<<n;
    return 0;
    }
    	for(int i=1;i<=k;i++){
    		cin>>a[i];
    	}
    	dfs(1,0,s);
    	dfs(1,1,s);
    	cout<<ans1<<" "<<ans2<<'\n';
    	return 0;
    }
    

    使用 ctrl+shift+a 后的效果如下:

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int n,s,k,now[49],a[49],ans1=1e15,ans2;
    void dfs(int p,int now,int res) {
    	if(p==k+1) {
    		ans1=min(ans1,res);
    		ans2=max(ans2,res);
    		return;
    	}
    	if(!now) res-=a[p];
    	else res+=a[p];
    	if(res>n||res<0) return;
    	dfs(p+1,0,res);
    	dfs(p+1,1,res);
    }
    signed main() {
    	freopen("submarine.in","r",stdin);
    	freopen("submarine.out","w",stdout);
    	cin>>n>>s>>k;
    	if(n>100000){
    	   cout<<0<<" "<<n;
    	     return 0;
       }
    	for(int i=1; i<=k; i++) {
    		cin>>a[i];
    	}
    	dfs(1,0,s);
    	dfs(1,1,s);
    	cout<<ans1<<" "<<ans2<<'\n';
    	return 0;
    }
    

    可以发现其卓有成效。

    随后,仿照人机的方式修改代码。我会打上注释说明修改点。

    //注意事项1:!now->now!=0,!n&1->n%2==0
    //注意事项2:人机会在运算符的两侧加上空格
    //注意事项3:人机会在逗号后添加空格
    //注意事项4:人机会在输出的内容两侧加上空格
    //注意事项5:人机会在 if 或 for 之后加上空格 
    //注意事项6:人机换行一般使用 endl,打空格一般使用 " " 
    //注意事项7:不要低估人机的智能度,请使用+=,-=等运算符
    //注意事项8:2的特例是,如果是+=,-=,当且仅当两端均为数组(vector)时会添加空格 
    //注意事项9:在头文件,using namespace std ,函数后加空行 
    #include<bits/stdc++.h>
    
    using namespace std;
    
    long long n, s, k, now[49], a[49], ans1=1e15, ans2;
    
    void dfs(int p, int now, int res) {
    	if(p == k + 1) {
    		ans1 = min(ans1, res);
    		ans2 = max(ans2, res);
    		return;
    	}
    	if (now != 0) res-=a[p];
    	else res+=a[p];
    	if (res > n || res < 0) return;
    	dfs(p+1, 0, res);
    	dfs(p+1, 1, res);
    }
    
    int main() {
    	freopen("submarine.in", "r", stdin);
    	freopen("submarine.out", "w", stdout);
    	cin >> n >> s >> k;
    	if (n > 100000) {
    	    cout << 0 << " " << n ;
    	    return 0;
        }
    	for (int i = 1; i <= k; i++) {
    		cin >> a[i];
    	}
    	dfs(1, 0, s);
    	dfs(1, 1, s);
    	cout << ans1 << " " << ans2 << endl;
    	return 0;
    }
    

    但这还是不够人机,况且人机会在中间搞出一些空行,怎么回事呢?接下来,就要寄出人机的重要武器了——

    vector

    我们需要将所有数组改为 vector,多维数组改为嵌套式 vector。并且放在函数内,而非全局变量。

    在一个 vector 的定义和与其连续的该 vector 的操作后,人机会留下空行。

    于是,可以得到如下内容。

  • 通过的题目

  • 最近活动

  • 最近编写的题解

    This person is lazy and didn't write any solutions.
  • Stat

  • Rating

题目标签

动态规划
8
dp
8
GESP
7
2024
6
NOIp 提高组
4
NOIp 普及组
4
2010
3
2023
3
枚举
3
暴力
3
递归
3
区间 dp
3
2001
2
2005
2
2006
2
模拟
2
背包
2
单调队列
2
数论
2
NOIP
2