NOIP 2015

来发一下写出来的代码…

**

DAY1

**

**

T1

**

这个还写么…不想写了…记录一下上次放哪了…模拟一下就好…

Update 11.15

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int a[50][50],n,ll,lc;

int main()
{
    freopen("magic.in","r",stdin);
    freopen("magic.out","w",stdout);
    scanf("%d",&n);//ll是上一次的列,lc是上一次的行(lastline;lastc....) 
    lc=1;ll=n/2+1;
    a[lc][ll]=1;
    for(int i=2;i<=n*n;i++)
    {
        if(lc==1&&ll!=n)
        {
            lc=n;ll=ll+1;
            a[lc][ll]=i;
            continue;
        }
        else if(ll==n&&lc!=1)
        {
            ll=1;
            lc--;
            a[lc][ll]=i;
            continue;
        }
        else if(lc==1&&ll==n){
            lc++;
            while(a[lc][ll])lc++;
            a[lc][ll]=i;
            continue;
        }
        else{
            int nc=lc-1,nl=ll+1;
            while(a[nc][nl]&&nc&&nl<=n)nc--,nl++;
            if(nc&&nl<=n)
            {
                a[nc][nl]=i;
                lc=nc;ll=nl;
                continue;
            }
            nc=lc+1;nl=ll;
            while(a[nc][nl])nc++;
            a[nc][nl]=i;
            lc=nc;ll=nl;
            continue;

        }
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            printf("%d%c",a[i][j],j==n?'\n':' ');
    return 0;
}

**


T2

**
这真是个悲伤的题目…

我使用的是tarjan…找大于1的最小的强连通分量…(就是这个条件我貌似忘了写…取min的时候因为初始化ans是0所以特判了一下ans==0强制赋值…然而貌似写在了判断强连通分量大于的外面…然后脑补了一下测评时候的的答案就可一致了呢(详情请参见 论2015NOIP的完挂…)….然后就爆零了)

洛谷上有测…但是不知道为什么总是有两个点运行错误了…求大神指正…(我数组都开到100倍大了…貌似不是访问无效内存的样子啊…)

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn=2000000+100;

struct data{int to,next;}e[maxn];

int head[maxn],dfn[maxn],low[maxn],cnt,tim,ans,n,top,q[maxn];

bool inq[maxn];

void ins(int u,int v){cnt++;e[cnt].to=v;e[cnt].next=head[u];head[u]=cnt;}

void tarjan(int x)
{
    int now=top;
    low[x]=dfn[x]=++tim;
    inq[x]=1;
    q[++top]=x;
    for(int i=head[x];i;i=e[i].next)
        if(!dfn[e[i].to])
        {
            tarjan(e[i].to);
            low[x]=min(low[x],low[e[i].to]);
        }
        else if(inq[e[i].to])
            low[x]=min(low[x],dfn[e[i].to]);
    if(dfn[x]==low[x])
    {
        if(top-now>1)
        {
            if(ans==0)ans=top-now;
            ans=min(ans,top-now);
        }
        while(top!=now)
        {
            inq[q[top]]=0;
            top--;
        }
    }
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int v;
        if(v<0)return 0;
        scanf("%d",&v);
        ins(i,v);
    }
    for(int i=1;i<=n;i++)
            if(!dfn[i])tarjan(i);
    printf("%d",ans);
    return 0;
}

**
ADD:(2015-11-09-11:47):貌似是因为tarjan的时候栈溢出了…求告知怎么破…?


T3

**
并不会正解…而且那代码也不想再打一次了…希望RP++多拿点分吧…

**



DAY2

**


**

T1

**
刚开始想用优先队列…但是不知道删左边还是右边的点…于是只能2分了(貌似最大值最小就应该第一时间想一想是不是二分…)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn=5e4+10;

int dis[maxn],n,m,L;

bool check(int l)
{
    int last=0,left=m;
    for(int i=1;i<=n;i++)
    {
        if(dis[i]-dis[last]<l)
        {
            if(left==0)return false;
            left--;
        }
        else{
            last=i;
        }
    }
    if(L-dis[last]<l&&left==0)return false;
    return true;
}

int main()
{
    scanf("%d%d%d",&L,&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&dis[i]);
    int l=0,r=1000000001;
    while(l<r)
    {
        int mid=(l+r)/2+1;
        if(check(mid))l=mid;
        else r=mid-1;
    }
    printf("%d\n",l);
    return 0;
}

To be continue…


——既然选择了远方,便只顾风雨兼程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值