130712练习赛

8 篇文章 0 订阅
3 篇文章 0 订阅
只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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值