zoukankan      html  css  js  c++  java
  • Codeforces Round #Pi (Div. 2)(A,B,C,D)

    A题:
    题目地址: Lineland Mail

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <set>
    #include <queue>
    #include <stack>
    #include <map>
    using namespace std;
    typedef long long LL;
    const int inf=0x3f3f3f3f;
    const double pi= acos(-1.0);
    const double esp=1e-6;
    const int maxn=1e5+10;
    struct node
    {
        int id;
        int value;
        int Max;
        int Min;
    }q[maxn];
    int cmp(struct node a,struct node b)
    {
        return a.value<b.value;
    }
    int cmp1(struct node a,struct node b)
    {
        return a.id<b.id;
    }
    int main()
    {
        int n,i;
        while(~scanf("%d",&n)){
            for(i=1;i<=n;i++){
                scanf("%d",&q[i].value);
                q[i].id=i;
                q[q[i].id].Max=0;
                q[q[i].id].Min=0;
            }
            sort(q+1,q+n+1,cmp);
            for(i=1;i<=n;i++){
                if(i==1){
                    q[i].Min=abs(q[1].value-q[2].value);
                    q[i].Max=abs(q[n].value-q[1].value);
                }
                else if(i==n){
                    q[i].Min=abs(q[n].value-q[n-1].value);
                    q[i].Max=abs(q[n].value-q[1].value);
                }
                else{
                    q[i].Min=min(abs(q[i].value-q[i-1].value),abs(q[i+1].value-q[i].value));
                    q[i].Max=max(abs(q[i].value-q[1].value),abs(q[n].value-q[i].value));
                }
            }
            sort(q+1,q+1+n,cmp);
            for(i=1;i<=n;i++){
                printf("%d %d
    ",q[i].Min,q[i].Max);
            }
        }
        return 0;
    }

    B题:
    题目地址:Berland National Library

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <set>
    #include <queue>
    #include <stack>
    #include <map>
    using namespace std;
    typedef long long LL;
    const int inf=0x3f3f3f3f;
    const double pi= acos(-1.0);
    const double esp=1e-6;
    const int maxn=110;
    const int maxn1=1e6+10;
    char str[10];
    int a;
    int vis[maxn1];
    int main()
    {
        int n;
        int cnt1,cnt2;
        while(~scanf("%d",&n)){
                memset(vis,0,sizeof(vis));
                cnt1=cnt2=0;
                for(int i=0;i<n;i++){
                    scanf("%s %d",&str,&a);
                    if(str[0]=='+'){
                        cnt1++;
                        vis[a]=1;
                        cnt2=max(cnt1,cnt2);
                    }
                    else{
                        if(!vis[a]){
                            cnt2++;
                        }
                        else{
                            vis[a]=0;
                            cnt1--;
                        }
                    }
                }
                printf("%d
    ",cnt2);
        }
        return 0;
    }

    C题:
    题目地址:Geometric Progression
    题意:求一个序列中形成以k为公比。项数为3的等比数列的种类数。
    思路:在这里我用map开了一个dp[i][j]数组,记录长度为i的以j结尾的数字有多少种。所以我们非常easy得出dp[i][j]+=dp[i-1][j/k],dp[1][j]=1。由于我在程序中是用x%k维护的,所以要倒推。由于数据问题map不要开map

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <set>
    #include <queue>
    #include <stack>
    #include <map>
    using namespace std;
    typedef long long LL;
    const int inf=0x3f3f3f3f;
    const double pi= acos(-1.0);
    const double esp=1e-6;
    const int maxn=200010;
    LL a[maxn];
    int main()
    {
        map<LL,LL> dp[4];
        int n,k,i;
        LL ans;
        while(~scanf("%d %d",&n,&k)){
            ans=0;
            for(i=0;i<4;i++)
                dp[i].clear();
            for(i=1;i<=n;i++)
                scanf("%lld",&a[i]);
            for (i=1;i<=n;i++){
                if(a[i]%k==0){
                    dp[3][a[i]]+=dp[2][a[i]/k];
                    dp[2][a[i]]+=dp[1][a[i]/k];
                }
                dp[1][a[i]]++;
            }
            map<LL,LL>::iterator it;
            for (it=dp[3].begin();it!=dp[3].end();it++)
                ans+=it->second;
            printf("%lld
    ",ans);
        }
        return 0;
    }

    D题:
    题目地址:One-Dimensional Battle Ships
    题意:给定一个区间。每次除去一个点,要求在剩下的空白里能放下。k个长为a的区间(a区间不能相离)。

    假设能放下,则输出-1。否则的话输出在去处第几个点的时候不能放下。
    思路:区间[l,r]每次去除一个点x,则当前剩下的区间为[l,x-1],[x+1,r]。然后找每一个区间能够放下的船数:(区间长度+1)/(船的长度+1){由于船和船之间相离,所以除以的是船的长度+1}。

    二分答案去找第几个点让放的船数不足k。

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <set>
    #include <queue>
    #include <stack>
    #include <map>
    using namespace std;
    typedef long long LL;
    const int inf=0x3f3f3f3f;
    const double pi= acos(-1.0);
    const double esp=1e-6;
    const int maxn=200010;
    int x[maxn];
    int x1[maxn];
    int n,k,a,m;
    int cnt;
    int Find(int m)
    {
        for(int i=1;i<=m;i++)
            x1[i]=x[i];
        sort(x1+1,x1+m+1);
        int len=0;
        cnt=0;
        for(int i=1;i<=m;i++){
            cnt+=(x1[i]-len)/(a+1);
            len=x1[i];
        }
        cnt+=(n+1-len)/(a+1);
        if(cnt>=k)
            return 1;
        else
            return 0;
    }
    int main()
    {
        scanf("%d %d %d",&n,&k,&a);
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
            scanf("%d",&x[i]);
        int l=1,r=m;
        int mid;
        int res=inf;
        while(l<=r){
            mid=(l+r)>>1;
            if(Find(mid)) l=mid+1;
            else {r=mid-1;
            res=min(res,mid);
            }
        }
         //printf("mid==%d
    ",mid);
        //printf("L==%d
    ",l);
        if(l>m)
            puts("-1");
        else
            printf("%d
    ",res);
    }
    
  • 相关阅读:
    14-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,调节LED亮度,8266程序编写
    Zookeeper之Curator(1)客户端基本的创建,删除,更新,查找操作api
    【1】基于quartz框架和Zookeeper实现集群化定时任务系统
    Spring源码学习之:ClassLoader学习(5)-自测
    java多线程:线程体往外抛出异常的处理机制实践
    MySQL详解--锁,事务
    ubuntu下访问支付宝官网,安装安全控件
    spring源码学习之:springAOP实现底层原理
    spring源码学习之:项目公共配置项解决方案
    java多线程:synchronized和lock比较浅析
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7394418.html
Copyright © 2011-2022 走看看