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

加油!!!

T1

此题太细节了,虽然我想了2小时
但考试时还是很多地方没想到
所以只得了 26.7 p t s 26.7pts 26.7pts

其实我们只需要用数学思维总结出四条通用规律,就能避免一堆的特判了!

  1. 把2个1放在两个不同的区间
  2. 把2个1放在同一个区间
  3. 把2个1分别放在头和尾
  4. 之间输出

A C   C o d e AC~Code AC Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,maxn1,maxn2,x,y,zhz=2147483647;
int a[100100],js;
char c;
int main()
{
	freopen("socdist.in","r",stdin);
	freopen("socdist.out","w",stdout);
	cin>>n;
	for(int i=1; i<=n; i++)
	 {
		cin>>c;
		if(c=='1')
		 {
			m++,a[m]=i;
			if(m>1)
		 	 {
				zhz=min(zhz,a[m]-a[m-1]);
				if(a[m]-a[m-1]>=maxn1)
				 {
					maxn2=maxn1;
					maxn1=a[m]-a[m-1];
				 }
				else
				  maxn2=max(maxn2,a[m]-a[m-1]);
			 }
		 }
	 }
	x=min(maxn1/2,maxn2/2),y=maxn1/3; //不同情况不同做法
	if(a[1]>1)
	 {
		x=max(x,min(a[1]-1,maxn1/2));
		y=max(y,(a[1]-1)/2);
	 }
	if(a[m]<n)
	 {
		x=max(x,min(n-a[m],maxn1/2));
		y=max(y,(n-a[m])/2);
	 }
	if(a[1]>1&&a[m]<n)
	  js=min(a[1]-1,n-a[m]);
	if(m==0)
	  cout<<n-1;
	else
	  cout<<min(zhz,max(x,max(y,js)));
	return 0;
}

T2

本题我没有很仔细地想
但其实 O ( n ) O(n) O(n)扫一遍就可以过

先把没感染的牛存下来,然后枚举他们, l l l r r r从枚举的位置开始向两边扩展,直到遇到一个被感染的牛
r = m i n ( r , m i n ( 当 前 牛 的 位 置 − l , r − 当 前 牛 的 位 置 ) r=min(r,min(当前牛的位置−l,r−当前牛的位置) r=minr,minlr
算出 r r r后我们枚举每一个点(利用分块思想),
最后输出ans就行了

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int maxn,minn=2147483647,tj=2147483647;
int n,x,y,r,l,pd,j,ans;
int a[1000010],b[1010];
int main()
{
	freopen("socdist2.in","r",stdin);
	freopen("socdist2.out","w",stdout);
	cin>>n;
	for(int i=1; i<=n; i++)
    {
        scanf("%d%d",&x,&y);
        if(y==1)
          a[x]=2;
        if(y==0)
         {
            a[x]=1;
            b[++j]=x;
         }
        maxn=max(maxn,x);
        minn=min(minn,x);
    }
    sort(b+1,b+1+j);
    for(int i=1; i<=j; i++)
     {
        l=b[i],r=b[i];
        while(a[l]!=2)   //分别向两边枚举,遇到被感染的牛才停下
         {
            l--;
            if(l<minn)
             {
                l=-2147483647;
                break;
             }
         }
        while(a[r]!=2)
         {
            r++;
            if(r>maxn)
             {
                r=2147483647;
                break;
             }
         }
        tj=min(tj,min(b[i]-l,r-b[i]));  //求 R
     }
    tj--;
    for(int i=minn; i<=maxn; i++)  //分块思想求开始传播之前已经得病的奶牛的最小数量
     {
        if(a[i]==2)
         {
            if(pd<=0)
		      ans++;  //一块结束后就答案++
	        pd=tj;
         }
	    else
	      pd--;
     }
    cout<<ans;
    return 0;
}

T3

考试时题目看的一头雾水
就放弃了,听了讲解后也不是很明白
还是等讲解回放吧!‘

A C   C o d e AC~Code AC Code

这题要放到明天做

总分

26.7 + 10 + 0 = 36.7 p t s 26.7+10+0=36.7pts 26.7+10+0=36.7pts

总结

  1. 不能懒,题目一定要钻研
  2. 不要轻易放弃一道题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值