• Codeforces Round #340 (Div. 2)


    A. Elephant

    题意:

    给定数x,从1.2.3.4.5中选择最少个数的数使最终和为x。

    分析:

    由于每个数字使用次数不限,所以每次都用5填充,若不能正好填满,剩下的余数再在1-4中选择。

    代码:

    #include<iostream>
    const int maxn=250;
    const int INF=0xfffffff;
    using namespace std;
    int main (void)
    {
        int a;
        cin>>a;
        int r=a/5;
        if(a%5==0) cout<<r;
        else cout<<r+1;
        return 0;
    }

    B. Chocolate

    题意:

    给定一序列01串,对他们进行划分,使得划分后的每一块都只有一个1,求有多少种划分方法

    分析:

    • 对于两个1中间夹着若干0的情况,可以在每个0后面进行一次划分,一个0对应一种划分方式
    • 对于以若干个0开头或结尾,只有一头有1的序列,这些0都要和这个1划分在一块中
    • 对于整个序列只有0的情况,划分方式为0
    • 对于整个序列只有1的情况,每个1都要划分为一块,即唯一一种划分方式

    代码

    #include<iostream>
    const int maxn=150;
    const int INF=0xfffffff;
    using namespace std;
    int a[maxn];
    int main (void)
    {
       int n;
       cin>>n;
       long long result = 1;
       int p = 1;
       int flag = 0;
       for(int i = 0; i < n; i++) {
            cin>>a[i];
            if(a[i] == 1) {result *= p; p = 1; flag = 1;}
            else if(flag == 1) p++;
       }
       if(flag == 0) cout<<0;
       else
            cout<<result;
        return 0;
    }

    C. Watering Flowers

    题意:

    给定两个圆心坐标,求两个圆的半径,使得满足所有点至少在一个圆中,且半径平方和最小

    分析:

    从距离第一个圆心最远的点开始,依次使第一个圆不包含该点,而第二个圆包含,求出每次对应的平方和,直到第二个圆包含所有点,遍历所有最佳可能情况,求出平方和最小值

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    const int maxn=2005;
    const int INF=0xfffffff;
    using namespace std;
    struct flower
    {
        long long d1;
        long long d2;
    
    }d[maxn];
    bool cmp(flower a,flower b)
    {
        if(a.d1 == b.d1) return a.d2<b.d2;
        else return a.d1<b.d1;
    }
    int main (void)
    {
        int n;
        long long x, y, x1,x2,y1,y2;
        scanf("%d%I64d%I64d%I64d%I64d",&n,&x1,&y1,&x2,&y2);
        for(int i = 1; i <= n; i++) {
                scanf("%I64d%I64d",&x,&y);
                d[i].d1=(x-x1)*(x-x1)+(y-y1)*(y-y1);
                d[i].d2=(x-x2)*(x-x2)+(y-y2)*(y-y2);
        }
        sort(d+1,d+n+1,cmp);
        d[0].d1 = 0;
        long long temp = 0;
        long long result = d[n].d1;
        for(int i = n-1; i >= 0; i--){
            temp = max(temp,d[i+1].d2);
            result = min(d[i].d1+temp,result);
             // cout<<result<<'='<<temp<<'+'<<d[i].d1<<endl;
        }
        printf("%I64d
    ",result);
    
        return 0;
    }

    D. Polyline

    题意:

    给定三个点坐标,计算用与坐标轴平行的线段将其连接起来的最少线段数,(在一条直线的两个线段算做一条线段)

    分析:

    • 三个点横或纵坐标相同,答案为1
    • 有两个点横或纵坐标相同,需对该三个点的纵或横坐标的关系进行判断
    • 三个点横纵坐标均不同,判断是否在一条直线上

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    const int INF = 0x3fffffff, maxn = 5;
    long long x[maxn],y[maxn];
    long long ma[maxn],mi[maxn],mj[maxn],mk[maxn];
    long long maxl = -1e10, minl =1e10,maxy = -1e10, miny = 1e10;
    long long midx,midy;
    int result;
    int main (void)
    {
        for(int i = 0; i < 3; i++) {
                scanf("%I64d%I64d",&x[i],&y[i]);
                maxl=max(maxl,x[i]);
                minl=min(minl,x[i]);
                maxy=max(maxy,y[i]);
                miny=min(miny,y[i]);
        }
        int k = 0, j = 0, a = 0, b = 0;
        for(int i = 0;i < 3; i++){
            if(x[i]==maxl) ma[k++]=y[i];
            else if(x[i]==minl) mi[j++]=y[i];
            else {midx=x[i];midy=y[i];}
            if(y[i]==maxy) mj[a++]=x[i];
            else if(y[i]==miny) mk[b++]=x[i];
        }
    
        sort(ma,ma+k);
        sort(mi,mi+j);
        sort(mk,mk+b);
        sort(mj,mj+a);
    
        if(k == 3||a == 3) result = 1;
        else if(k == 2){
            if(ma[0]<mi[0]&&ma[1]>mi[0]) result=3;
            else result=2;
        }
        else if(j == 2){
            if(ma[0]>mi[0]&&ma[0]<mi[1]) result=3;
            else result=2;
        }
        else if(a == 2){
            if(mj[0]<mk[0]&&mj[1]>mk[0]) result=3;
            else result=2;
        }
        else if(b == 2){
            if(mj[0]>mk[0]&&mj[0]<mk[1]) result=3;
            else result=2;
        }
        else if((double)(midy-ma[0])/(midx-maxl)==(double)(ma[0]-mi[0])/(maxl-minl))
             result = 1;
        else
            result = 3;
        printf("%d
    ",result);
        return 0;
    }
  • 相关阅读:
    SqlCeConnectionBeginTransaction 方法
    父子继承窗体,子窗体视图无法正常打开,解决办法
    Windows Mobile 如何和模拟器关联有用的URL
    Windows Mobile 6.5.3 Developer Tool Kit
    通过Eclipse import导入项目,並重新命名Project
    【杂】Oracle使用记录:分区表及执行计划
    实践 2-0 selenium使用的一些总结
    实践2-1 python连接Oracle数据库
    【杂】word文件加密和压缩加密
    【杂】HIVE使用记录:回收站及从回收站恢复分区表
  • 原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758849.html
Copyright © 2020-2023  润新知