博客
关于我
纪中2020.4.8普及C组模拟赛总结
阅读量:337 次
发布时间:2019-03-04

本文共 2663 字,大约阅读时间需要 8 分钟。

加油!!!

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. 不要轻易放弃一道题

转载地址:http://dile.baihongyu.com/

你可能感兴趣的文章
Edge浏览器:你的的内核我的芯
查看>>
chrome浏览器功能介绍
查看>>
linux shell 读取文件脚本
查看>>
git命令升级版用法
查看>>
sed常用命令
查看>>
linux下各种小命令
查看>>
checksec未完待续~
查看>>
python pexpect
查看>>
inode索引节点的概念
查看>>
python时间格式转换time模块
查看>>
文件校验
查看>>
python can i use return in wiht statement?
查看>>
coddenomicon工具
查看>>
create-react-app第一步
查看>>
testng测试工具简介
查看>>
mysql查看数据库状态
查看>>
怎么去利用已有的数据做分析?
查看>>
小程序开发之第三天
查看>>
自适应数字墙星系网站404页面源码
查看>>
某易游戏经典吃豆豆动画404页面源码
查看>>