只A了两题,A题不说了,水题只要将每时刻的顾客人数++,再扫一遍找最大值就行了。重点是C题,C题用的是预处理加二分枚举查找的方式写的,先写出各个数之内的素数个数,再通过二分找到等于k个素数的l值就行了。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#define maxx 1000010
int x[maxx],y[maxx];
using namespace std;
int main()
{
int a,b,k,i,j;
scanf("%d%d%d",&a,&b,&k);
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
for(i=2; i<(b+10); ++i)//找素数
{
x[i]=x[i-1];
if(!y[i])
{
x[i]++;
for(j=i*2; j<(b+10); j+=i)
{
y[j]=1;
}
}
}
if(x[b]-x[a-1]<k)//判断是否存在
{
cout<<-1<<endl;
}
else
{
int high=b-a+1,low=1,mid,w;
while(low<high)
{
mid=(low+high)/2;
w=1;
for(i=a; i<=b-mid+1; ++i)//枚举
{
if(x[i+mid-1]-x[i-1]<k)
{
w=0;
}
}
if(w==1)
{
high=mid;
}
else
{
low=mid+1;
}
}
printf("%d\n",high);
}
return 0;
}
B题是赛后AC的,赛前就写完了,但一直不出样例,后来发现是特别弱智的错误,w++我连加四次,果然用这么多数组保存是要付出代价的,下次尝试一下pair。。。其实就是暴力查找。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
int a[55],b[55][55],c[2555],u[2555],v[2555],o[2555],z[2555];
using namespace std;
int main()
{
int n,i,j,k,d,y,p,q,w,f,r;
cin>>n;
for(i=0; i<n; ++i)//输入
{
cin>>a[i];
}
k=0;
for(i=0; i<n; ++i)
{
for(j=0; j<a[i]; ++j)
{
cin>>b[i][j];
c[k++]=b[i][j];//二维转化为一维
}
}
sort(c,c+k);//排序
d=y=w=0;
for(i=0; i<k; ++i)
{
f=0;
for(j=0; j<n; ++j)//查找
{
for(r=0; r<a[j]; ++r)
{
if(c[i]==b[j][r])
{
f=1;
p=j;
q=r;
}
}
}
if(f==0)
{
p=-1;
q=-1;
}
//cout<<p<<' '<<q<<' '<<d-y<<' '<<y<<'\n';
while(d-y<0||d-y>=n||y>=a[d-y])//标记位置
{
if(d-y<0)
{
d++;
y=0;
}
while(d-y>=n||(y<=d&&y>=a[d-y]))
{
y++;
}
}
if(p==d-y&&q==y)
{
y++;
continue;
}
swap(b[d-y][y],b[p][q]);//交换位置
u[w]=d-y;//保存位置
v[w]=y;
o[w]=p;
z[w]=q;
w++;
y++;
}
cout<<w<<endl;
for(i=0; i<w; ++i)
{
cout<<u[i]+1<<" "<<v[i]+1<<" "<<o[i]+1<<" "<<z[i]+1<<endl;
}
return 0;
}
D题构造题。而且是special judge。所以题意反正也没算看太懂,算是看样例写得。。。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>
#define N 100010
using namespace std;
vector<int> f[N];
int main()
{
int n,x,y,i,j;
scanf("%d",&n);
printf("%d\n",n-1);
for(i=1; i<n; i++)
{
scanf("%d%d",&x,&y);
f[x].push_back(i);
f[y].push_back(i);
printf("2 %d %d\n",x,y);
}
for(i=1; i<=n; i++)
{
for(j=1; j<f[i].size(); j++)
{
printf("%d %d\n",f[i][j-1],f[i][j]);
}
}
return 0;
}