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了。
为什么要练,为什么要写?
引用一句让我幡然悔悟的话:
“练了不一定写的出来正解,不练一定写不出来正解”
本文来自博客园,作者:Hanggoash,转载请注明原文链接:https://www.cnblogs.com/Hanggoash/p/18514442