劳役结合的第二天

菜死我了

我是废物

我是厕所清道夫

分了个班,虽说没冲进好班是意料之中吧,但是没想到的是老班没换,乾!!就离谱!!!
然而今天一开始还是磕了一会儿上回所说的那道窗户,改前天的那个版本,并且伟大而又圣洁的学长.还帮我看了几下,机制而又神勇的邱宇大佬在干活儿做家务中忙里偷闲发了我几个我过不了的数据让我自己改,但我始终是改不出来,毕竟不能太依赖学长,于是我觉得可能那个方法确实是错的。

上午

主要学了如何生成随机数,随机数的原理,如何跑数据,怎么对拍

暴力出奇迹,对拍保平安

#include <cstdlib>
#include <ctime>
#include <cstdio>
using namespace std;
int main()
{
    
    
	for(int T=1;T<=10086;T++)
	{
    
    
		system("");
		
		double st=clock();
		
		system("");
		
		double ed=clock()
		
		system("");
		
		if(system(""))
		{
    
    
			puts("")
			
			return 0;
		}
		
		else 
		{
    
    
			print("Ac,测试点 #%d,用时 %.01fms\n",T,ed-st);
		}
	}
}

对拍大概就是这样吧,然后双引号里的是所写的两个代码的输出文件啥的

下午

学了trie树,听是听懂了,但就是还不会写,于是我就拿之前欠的 合并果子

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long a[N],n,sum,len;
int main() 
{
    
    
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)	scanf("%lld",&a[i]); 
	sort(a+1,a+n+1);
	while(len<n)
	{
    
    
		len=1;
		while(a[len]==0)	len++;
		a[len]+=a[len+1];
		sum+=a[len];
		for(int i=len+1;i<n;i++)	a[i]=a[i+1];
		n--;
		for(int i=len;i<n;i++)
			if(a[i]>a[i+1])
				swap(a[i],a[i+1]);
	}
	printf("%lld",sum);
	return 0;
}

最小的两堆果子相加,但是加完之后就不是最小的了,要比较然后交换一下,每次都sort的话很容易超时,码完之后心情愉快。
于是我在课间从机房回了趟新班,发现我连桌子都没有,主要还是因为我太菜了吧,凡事都要问自己配不配,我配有桌子么?据说在我回来之前他们都做了自我介绍,而我被隔过去了,所以他们大多数人都不认识我,这是很可怜的,因为不认识我就意味着不知道人类能菜到什么程度。

于是我回来之后就开始照着书上看Trie树

码第一道板子题The XOR Largest Pair.

#include <bits/stdc++.h>
using namespace std;
long long a[123456],ans,n;
int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i!=j)	ans=max(ans,a[i]^a[j]);
	cout<<ans;
	return 0;
}

校oj中这样枚举能暴力80分,跑这题数据的人一生平安!!!orz
但是平时写题还是得写正解

但我实在太菜了,就写了会儿文化课作业

后来我想了想,亦或这东西是按照每一位,如果不同就变成1,相同则为0,所以我决定判断一下最大的数的位数,然后用位数和这个数一样的数^其他位数比这个小的数,看起来确实能优化不少。

#include <bits/stdc++.h>
using namespace std;
long long weishu,a[123456],xinshuzu[123456],er[123456],ans,len,n;
int main()
{
    
    
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
    
    
		scanf("%lld",&a[i]);
	}
	sort(a+1,a+1+n);
	er[0]=1;
	for(int i=1;i<=33;i++) er[i]=er[i-1]*2;
	for(int i=1;i<=n;i++)
	{
    
    
		if(er[i]>a[n])
		{
    
    
			weishu=i-1;
			break;
		}
		if(er[i]==a[n])
		{
    
    
			weishu=i;
			break;
		}
	}
	for(int i=n;i>=1;i--)
	{
    
    
		if(er[weishu]<=a[i])
		{
    
    
			xinshuzu[++len]=a[i];
			n--;
		}
		else break;
	}
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=len;j++)
		{
    
    
			ans=max(ans,xinshuzu[j]^a[i]);
		}
	}
	cout<<ans;
	return 0;
}

如行云流水般一气呵成,于是在校oj上得了60分的高分,其中有20分还是超时,看来跑数据的人可能也想到了我这种投机取巧的方法,卡了两组,还不如纯暴力。
在听myf大佬的讲解后,我明白要把每个数的每一位存起来,存到二维数组里,然后匹配,不行就将就一下。

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
int x,ans,t[N][32],len=1,n,num;
void insert(int a)
{
    
    
	int p=1;
	for(int k=30;k>=0;k--)
	{
    
    
		num=a>>k&1;
		if(t[p][num]==0)
			t[p][num]=++ len;
		p=t[p][num];
	}
}
int work(int a)
{
    
    
	int sum=0;
	int p=1;
	for(int k=30;k>=0;k--)
	{
    
    
		num=a>>k&1;
		if(t[p][!num])
		{
    
    
			sum=sum|(1<<k);
			p=t[p][!num];
		}
		else
			p=t[p][num];
	}
	return sum;
}
int main()
{
    
    //freopen("test.in","r",stdin);freopen("test.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
    
    
		scanf("%lld",&x);
		insert(x);
		ans=max(ans,work(x));
	}
	cout<<ans;
	return 0;
}

然后就愉快地ac了。
但是有位大佬写的是

#include<bits/stdc++.h>
using namespace std;
string s;
int t[1000100][30],tot=1;
void add(string str)
{
    
    
	int len=str.size();
	int p=1;
	for(int i=0;i<len;i++)
	{
    
    
		int ch=str[i]-'A';
		if(t[p][ch]==0) t[p][ch]=++tot;
		p=t[p][ch];
	}
}
int main()
{
    
    
	while(getline(cin,s))
	add(s);
	cout<<tot;
	return 0;
}

这样的,基本上就是只在大数据上加个特判,于是我和hyp大佬高高兴兴地跑了5组数据,卡掉这个男人。毕竟我暴力没做出来的题也不能让别人暴力做出来。
重测完以后发现我80分代码只能36分,但是60分的代码可以搞到72分

严厉打击别人骗分,同时提高自己骗到的分

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ydsrwex/article/details/113613276