Codeforces Round #Pi (Div. 2)

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;
}


發佈了249 篇原創文章 · 獲贊 7 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章