czl蒻蒟的OI之路8

  • XJOI奋斗群蒻蒟群群赛9 RANK排名12
      • T1SnacktowerWA三次后AC
          • 题意
          • 分析过程
          • 给出题解
      • T2The QueueWA六次后AC
          • 题意
          • 分析过程
          • 给出题解
      • T3GarlandWA一次后AC
          • 题意
          • 分析过程
          • 给出题解
      • T4Broken BST
          • 题意
          • 分析过程
          • 给出题解
      • T5Array Queries
          • 题意
          • 分析过程
          • 给出题解
      • 蒻蒟的总结

—>XJOI奋斗群(蒻蒟群)群赛9<— RANK排名12

T1:Snacktower(WA三次后AC)

题意:

给你一堆无序的数组,这些数分别会在不同的天数掉下来(ai在第i天掉下来)。让你输出这个数组成的数塔。要求从下到上是递减的,并且输出每天组成的数塔的元素,如果该天不能组成数塔,就输出空行。

分析过程:

因为数塔由下到上是递减的,所以只有当最大的数字掉下来的时候,才能够开始组成数塔。由此递推,当一个数掉下来时,判断这个数到最大数之间所有的数是否都已经掉下来了,如果都掉下来了,就把这些都输出,反之则输出空行。

给出题解:
#include
using namespace std;
int s[100002];
bool compare(int a,int b)
{
    return a>b;
}
int main()
{
    int n,j=1;
    cin>>n;
    int print[100002]={0};
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
    }
            int a=n;
    for(int i=1;i<=n;i++)
    {

        print[s[i]]=1;
        for(int k=a;k>=1;k--)
        {
            if(print[k]==1)
            {
                cout<" ";
                a--;
            }
            if(print[k]==0)break;
        }
        cout<return 0;
}

T2:The Queue(WA六次后AC)

题意:

一个地方在ts到tf-1的时段是开门的,服务每个人需要k的时间。给出n个人和他们来排队的时间。规定如果你和一个人同时到达,你会屈服。。会排到到后面一位。要你求最小的等待时间。

分析过程:

要求等待的最小时间,有n个人,那么只有n+1中方案,即排在每个人的前面一分钟或后面。只要遍历这些点,并求出最小的等待时间就可以了。

给出题解:
#include
using namespace std;

int main()
{
    long long ts,tf,t,n,pai,minn=1e12,ans;
    cin>>ts>>tf>>t;
    cin>>n;
    for(int i=n;i>=1;i--)
    {
        cin>>pai;
        if(pai&&pai<=tf-t)
        {
        long long j=max(pai-1,ts);
        if(j<=tf-t&&ts-pai+11;
            ans=min(pai-1,ts);
        }
        ts=max(ts,pai)+t;
        }
    }
    if(ts<=tf-t)ans=ts;
    cout<return 0;
}

T3:Garland(WA一次后AC)

题意:

简单来说,就是给你一棵树,让你把这颗树分成3段,每段的所有节点的和都相等。让你求是否有这种方案。如果有,就输出切割的点,如果没有就输出-1。

分析过程:

这题可以不用建树,用邻接表也同样可以做出来。只要从一个叶子节点向上遍历,搜索到这个节点的和路径上的所有点的和达到一定值就记录该节点,并将ans归零,继续搜索。如果搜索完之后只搜索到一个切割的带你,就输出-1,否则输出切割的两个点。

给出题解:
#include
#define maxn 1000050
using namespace std;

int n,sum,l,tem[maxn],ans,x=0,f[maxn],cut=0,node,cut1;

struct tree
{
    int next;
    int to;
}a[maxn];

void add(int c,int d)
{
    x++;
    a[x].to=d;
    a[x].next=f[c];
    f[c]=x;
}

void dfs(int c)
{
    int d=c;
    c=f[c];
    while(c!=-1)
    {
        dfs(a[c].to);
        tem[d]+=tem[a[c].to];
        c=a[c].next;
//      cout<
    }
    if(tem[d]==ans&&d!=node)
    {
        if(cut==0)
        {
        cut++;
        tem[d]=0;
        cut1=d;
        }
        else 
        {
        cut++;
        cout<" "<exit(0);
        }
    }
}
int main()
{
//  freopen("in.txt","r",stdin);
    memset(f,-1,sizeof(f));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&l,&tem[i]);
        if(l!=0)
        add(l,i);
        if(l==0)
        node=i;
        ans+=tem[i];
    }
//  cout<<"node="<
    if(ans%3!=0)
    {
        printf("-1\n");
        exit(0);
    }
    else ans=ans/3;
    dfs(node);
//  cout<
    if(cut!=2)
    {
        printf("-1\n");
        exit(0);
    }
}

T4:Broken BST

题意:

冰箱里有一些牛奶,超市里也有一些牛奶。每瓶牛奶都有一个保质期,问你在牛奶保质期之内,是否能够将冰箱里的牛奶喝完。如果可以,问最大能够从商店里买来几瓶牛奶,同样在保质期前喝完。

分析过程:

首先先判断一遍冰箱里的牛奶能否喝完,在把超市里的牛奶按保质期从大到小排序(当然是和保质期长的牛奶更能满足题目要求呀),二分超市里的牛奶,搜索能够买的最大的牛奶的数量。

给出题解:
#include
#define maxn 10000001
using namespace std;

int n,m,k;  
int f[maxn];
int c[maxn*2];
int print[maxn];
struct milk
{
    int date;
    int x;
}a[maxn];

bool compare(milk a,milk b)
{
    return a.date>b.date;
}

bool j(int a[],int b)
{
    int d=0;
    int cont=0;
    for(int i=1;i<=b;i++)
    {
        if(d>a[i])return false;
        cont++;
        if(cont==k)
        {
            cont=0;
            d++;
        }
    }
    return true;
}
bool shop(int mid)
{
    int x=0;
    for(int i=1;i<=n;i++)
    {
        x++;
        c[x]=f[i];
    }
    for(int i=1;i<=mid;i++)
    {
        x++;
        c[x]=a[i].date;
    }
    sort(c+1,c+1+x);
    if(j(c,x)==true)
    {
        for(int i=1;i<=mid;i++)
        {
            print[i]=a[i].x;
        }
        return true;
    }
    else return false;
}

int main()
{

    scanf("%d %d %d",&n,&m,&k);
    for(int i=1;i<=n;i++)scanf("%d",&f[i]);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&a[i].date);
        a[i].x=i;
    }
    sort(f+1,f+1+n);
    sort(a+1,a+1+m,compare);
    if(j(f,n)==false)
    {
    printf("-1\n");
    return 0; 
    } 
    int cnt=0;
    int left=1;
    int right=m;
    while(right-left>=0)
    {
        int mid=(left+right)/2;
        if(shop(mid)==true)
        {
            left=mid+1;
            cnt=mid;
        }
        else
        {
            right=mid-1;
        }
    }
    printf("%d\n",cnt);
    for(int i=1;i<=cnt;i++)
    {
        printf("%d ",print[i]);
    }
    printf("\n");
    return 0;
}

T5:Array Queries

题意:
分析过程:
给出题解:

蒻蒟的总结:

这又是昨天的题目,表示题目很多根本补不完啊。现在还剩下dp的3题,群赛的2题没有补,这么看来,周六要跑死了啊。加油吧,坚持你的补题之路,微博也要坚持写下去。
继续贴出吴老师的话:学信息的人永不服输!!!

你可能感兴趣的:(蒟蒻OI之路)