Edu171 Review

Edu171 Review

这场好像没什么人打,莫名其妙就上分了。

甚至获得了青名体验卡,不过下一场应该就掉下去了。

A

一个很显然的贪心构造

Code

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}	
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}	
	x*=f;
}
template<typename T>inline void wr(T x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)wr(x/10);
	putchar(x%10^48);
}
inline void out(int x){wr(x),putchar('\n');}
int n,T;
int X,Y,K;
inline void solve()
{
	int len=min(X,Y);
	printf("0 0 %d %d\n0 %d %d 0\n",len,len,len,len);
} 
int main()
{
	re(T);
	while(T--)
	{
		cin>>X>>Y>>K;
		solve();
	}
	return 0;
}

B

还是个贪心,一开始写个了 \(O(n)\) 的算法,结果吃了一次罚时,回头发现 \(n\le 2000\) ,好像如果 线性能过,应该不会给这么小的数据,那么想想是否可以 \(O(n^2)\)

好像确实有所遗漏,实际上每个点都可以单独拎出来考虑( \(N\) 为奇数的情况下)。

所以最后是 \(O(n^2)\) 的。

这题要是再多一发罚时,就上不了青了,或许会少一些烦恼。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
template<typename T>inline void re(T &x)
{
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}	
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}	
	x*=f;
}
template<typename T>inline void wr(T x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)wr(x/10);
	putchar(x%10^48);
}
inline void out(int x){wr(x),putchar('\n');}
int n,T;
int a[100000];
int ban;
int nex(int x)
{
	return ban==x+1?x+2:x+1;
 } 
inline void solve()
{
	int ans=1;
	if(n%2==1)
	{
		ans=1e18+10;
		for(register int b=1;b<=n;++b)
		{
			ban=b;
			int tmp=1;
			for(register int i=1;i<=n;i+=2)
			{
				if(i==b)
				{
					i--;
					continue; 
				}
				tmp=max(tmp,a[nex(i)]-a[i]);
				if(i+1==b)i++; 
			} 
			ans=min(ans,tmp); 
		}
	}
	else
		for(register int i=1;i<=n-1;i+=2)ans=max(ans,a[i+1]-a[i]);
	out(ans);
}
signed main()
{
	re(T);
	while(T--)
	{
		re(n);
		for(register int i=1;i<=n;++i)
			re(a[i]);
		solve();
	}
	return 0;
}
/*
x 4 5 6 8 9 11 
*/

C

写了个莫名其妙但是很正确的贪心,然后就过了,幸好没人hack,我也不知道正不正确。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
template<typename T>inline void re(T &x)
{
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}	
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}	
	x*=f;
}
template<typename T>inline void wr(T x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)wr(x/10);
	putchar(x%10^48);
}
inline void out(int x){wr(x),putchar('\n');}
int n,m,T;
char s[400010];
signed main()
{
	re(T);
	while(T--)
	{
		int n;
		re(n);
		scanf("%s",s+1);
		int res0=0,res1=0,used0=0;
		for(register int i=1;i<=n;++i)
		{
			if(s[i]=='1')res1++;
			else res0++;
		}
		int ans=n*(n+1)/2;
		for(register int i=n;i>=1;--i)
		{
//			printf("nowpos:%lld res1:%lld res0:%lld used0:%lld\n",i,res1,res0,used0);
			if(s[i]=='1')
			{
				if(res0>0)
				{
					res0--;
					used0++;
					ans-=i;
				}
				else if(res0==0&&res1>=2)
				{
					res1--;
					ans-=i;
				}
				res1--;
				if(res1==0)break;
			}
			else
			{
				if(used0>0)
				{
					used0--;
					continue;
				}
				if(res0>0)res0--;
			}
		}
		out(ans); 
	}
	return 0;
}

/*

4
1
1
6
101101
7
1110001
5
11111

1 5 6 .1+5
4 2 .2
3
*/	

之后应该不会写太多单独的Review了。

posted @ 2024-10-29 20:57  Hanggoash  阅读(8)  评论(0编辑  收藏  举报
动态线条
动态线条end