纪中2020.3.4普及C组模拟赛总结

这次还好

T1

看了一眼数据, O ( n ) O(n) O(n)的时间复杂度显然可过
所以——
大胆暴力
拿到了 100 p t s 100pts 100pts

A C   C o d e AC~Code AC Code

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,ans=922337203685477,js;
long long x[100010],y[100010];
int main()
{
	freopen("marathon.in","r",stdin);
	freopen("marathon.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1; i<=n; i++)
	 {
	 	scanf("%lld %lld",&x[i],&y[i]);
	 	if(i>=2)
	 	  js=js+abs(x[i]-x[i-1])+abs(y[i]-y[i-1]);   //统计
	 }
	for(int i=2; i<=n-1; i++)
	 {
	 	if(js-abs(x[i]-x[i-1])-abs(y[i]-y[i-1])-abs(x[i]-x[i+1])-
	 	abs(y[i]-y[i+1])+abs(x[i-1]-x[i+1])+abs(y[i-1]-y[i+1])<ans) //类似搭桥
        ans=js-abs(x[i]-x[i-1])-abs(y[i]-y[i-1])-abs(x[i]-x[i+1])-
        abs(y[i]-y[i+1])+abs(x[i-1]-x[i+1])+abs(y[i-1]-y[i+1]);
	 }
	printf("%lld",ans);
	return 0;
}

T2

发现了正数与负数的巧妙联系,
再看一眼数据, O ( n ) O(n) O(n)的时间复杂度显然可过
所以——
大胆暴力
拿到 100 p t s 100pts 100pts

A C   C o d e AC~Code AC Code

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,ans=999999999;
struct node
{
	long long a,b;
}boss[1000010];
int cmp(const node&aa,const node&bb)
{
	return aa.a<bb.a;
}
int main()
{
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1; i<=n; i++)
	 {
	 	scanf("%lld",&boss[i].a);
	 	boss[i].b=boss[i].a;
	 	if(boss[i].a<0)      //全部变正数
	 	  boss[i].a*=-1;
	 }
	sort(boss+1,boss+1+n,cmp);    //结构体排序
	for(int i=2; i<=n; i++)
	 if(abs(boss[i].b+boss[i-1].b)<ans)
	   ans=abs(boss[i].b+boss[i-1].b);
	printf("%lld",ans);
	return 0;
}

T3

比赛时输出样例
拿了10分。。。
正解:前缀和+贪心

A C   C o d e AC~Code AC Code

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int ans,c[1000010],n,js;
char x;
struct node
{
	int a,b;
}e[1000005];
bool cmp(const node&l,const node&r)
{
	return l.a<r.a;
}
int main()
{
    freopen("fairphoto.in","r",stdin);
    freopen("fairphoto.out","w",stdout);
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
     {
        cin>>e[i].a>>x;
        if(x=='G')
          e[i].b=1;          //G放1,H放-1.
        else
          e[i].b=-1;
     }
    sort(e+1,e+n+1,cmp);        //快排,保证最优性。
    for(int i=1; i<=n; i++)
     {
        js+=e[i].b;
        if(js==0)
          ans=max(ans,e[i].a-e[1].a);      //贪心
        if(c[js+n]==0)
          c[js+n]=i;
        else
		  ans=max(ans,e[i].a-e[c[js+n]+1].a);     //前一段-后一段
     }
	printf("%d",ans);
    return 0;
}

T4

这题我本来可以拿93.3分的!!!
结果神经质多打了个 f o r for for
导致只有 40 p t s 40pts 40pts
正解也是模拟

A C   C o d e AC~Code AC Code

#include<algorithm>
#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int ls,lzs,i,js;
string s,zs;
int main()
{
	freopen("censor.in","r",stdin);
	freopen("censor.out","w",stdout);
	cin>>s>>zs;
	ls=s.size();
	lzs=zs.size();
 	while(i<=ls-1)
 	 {
 		if(s[i]==zs[lzs-1]&&i>=lzs-1)
 	 	 {	
 			js=i-lzs+1;
 			for(int j=0;j<=lzs-1;j++)   //用for节省一些时间
 			 if(zs[j]==s[js])
			   js++;
 			 else
			  {
				 js=-1;
				 break;
			  }
 			if(js!=-1)
			 {
			 	s.erase(i-lzs+1,lzs);
				i-=lzs;
			 }  
		 }
		i++;
	 }
	cout<<s;
	return 0;
}

T5

骗分失败, 0 p t s 0pts 0pts
正解:DP

还没做
A C   C o d e AC~Code AC Code

总分:

100 + 100 + 10 + 40 = 250 p t s 100+100+10+40=250pts 100+100+10+40=250pts

总结:

  1. 做完题后如果还有时间要回来看看做过的题目能不能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值