码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #Pi (Div. 2)

时间:2015-08-06 13:19:49      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:acm   algorithm   编程   codeforces   算法   

B题

A题

 

题目大意:

   给出一个数组,找每个位置的与序列里的其他值的差的绝对值最大值与最小值。


解题思路:

   记录位置并排序,最大值肯定与排序后的头元素或尾元素的差,最小值肯定是排序后的位置的前一个元素或者后一个元素。


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=200000+1000;
struct node
{
    int x;
    int cur;
}a[maxn];
int b[maxn];
int c[maxn];
bool cmp(node u,node v)
{
    return u.x<v.x;
}
int bbs(int x)
{
    if(x<0)
    return -x;
    return x;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i].x);
            a[i].cur=i;
        }
        sort(a,a+n,cmp);
        for(int i=0;i<n;i++)
        {
            if(i==0)
            b[a[i].cur]=a[i+1].x-a[i].x;
            else if(i==n-1)
            b[a[i].cur]=a[n-1].x-a[i-1].x;
            else
            b[a[i].cur]=min(bbs(a[i-1].x-a[i].x),bbs(a[i+1].x-a[i].x));
            c[a[i].cur]=max(bbs(a[0].x-a[i].x),bbs(a[n-1].x-a[i].x));
        }
        for(int i=0;i<n;i++)
        printf("%d %d\n",b[i],c[i]);
    }
    return 0;
}


B题


 题目大意:

      给出进出日志,求房间的最小容量。


解题思路:

     房间的容量取决于房间最多人的时候。


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
const int maxn=1000000+100;
int a[maxn];
int c[maxn];
int main()
{
    char s[15];
    int n;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        int d;
        int ans=0,cur=0;
        int sign=0;
        for(int i=0;i<n;i++)
        {
            scanf("%s%d",s,&d);
            if(s[0]=='+')
            {
                sign++;
                a[d]=1;
                c[i]=sign;
            }
            else
            {
                if(a[d]==1)
                {
                    sign--;
                   a[d]=0;
                   c[i]=sign;
                }
                else
                {
                    c[i]=c[i-1]+1;
                    for(int j=i-1;j>=0;j--)
                    c[j]++;
                }
            }
        }
        for(int i=0;i<n;i++)
        {
            ans=max(ans,c[i]);
        }
        cout<<ans<<endl;
    }
    return 0;
}


C题


题目大意:

     给出一段序列,求序列里的3个数成等比数列,且比值为k的数量。

解题思路:

    配句中间那个元素,前面那个元素和后面那个元素出现的次数相乘就可。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
map<long long,int> ma;
map<long long,int> ma2;
long long a[210000];
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=0; i<n; i++)
    {
        cin>>a[i];
    }
    ma.clear(),ma2.clear();
    for(int i=n-1; i>=0; i--)
    {
        ma[a[i]]++;
    }
    long long ans=0;
    for(int i=0; i<n; i++)
    {
        ma[a[i]]--;
        long long cur=0;
        if(ma[a[i]*k])
        {
            cur=ma[a[i]*k];
            if(a[i]%k==0)
            {
                if(ma2[a[i]/k])
                {
                    cur=cur*ma2[a[i]/k];
                    //cout<<cur<<"  "<<ma2[a[i]/k]<<"   "<<a[i]/k<<endl;
                }
                else
                cur=0;
            }
            else
            cur=0;
        }
        ma2[a[i]]++;
        ans+=cur;
        //cout<<cur<<endl;
    }
    cout<<ans<<endl;
    return 0;
}


D题


题目大意:

      n个1*1的小格子,k个1*a的小船,要将k个小船放进n个格子内,不能相邻,接着m个操作,每次让第xi个格子不能用,求第几个操作后船就放不下了。


解题思路:

      每次操作,只会讲1段区间分成2段,只需求分开前后少放了几个小船。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
set<int> s;
int main()
{
    int n,k,a;
    scanf("%d%d%d",&n,&k,&a);
    int m,x;
    scanf("%d",&m);
    s.insert(0);
    s.insert(n+1);
    int ans=-1;
    int cur=1+(n-a)/(a+1),x1,x2;
    //cout<<cur<<endl;
    if(cur<k)
    {
        ans=0;
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d",&x);
        if(ans!=-1)
        continue;
        int temp=*(--s.upper_bound(x));
        int tempd=*(s.upper_bound(x));
        s.insert(x);
        //cout<<temp<<"         "<<tempd<<endl;
        x1=0,x2=0;
        if(tempd-temp-1>=a)
        x1=1+(tempd-temp-1-a)/(a+1);
        if(x-temp-1>=a)
        x2=1+(x-temp-1-a)/(a+1);
        if(tempd-x-1>=a)
        x2+=(1+(tempd-x-1-a)/(a+1));
        //cout<<x1<<"  "<<x2<<endl;
        cur-=(x1-x2);
        if(cur<k)
        {
            ans=i+1;
        }
    }
    cout<<ans<<endl;
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces Round #Pi (Div. 2)

标签:acm   algorithm   编程   codeforces   算法   

原文地址:http://blog.csdn.net/caduca/article/details/47313511

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!