zoukankan      html  css  js  c++  java
  • "贪心"的考试

    先来落实比较简单的T3,T4

    T3  团结的队伍 team
    题目描述

    众所周知,长郡信息组是一个团结友爱的优秀团队。为了弘扬团队精神,践
    行社会主义核心价值观,秉承朴实沉毅的校训,信息组决定外出游玩(。。。。。。)。
    jump:“你们想怎么玩?”
    xzy:“要组队一起走。”
    XYK:“我喜欢 2 个人组一队。”
    LCF:“我太犇了,我要一个人走。”
    llg:“Please call me Captain Farmer. I ‘ll lead the way ~”
    LRH:“jump is a code farmer.”
    dyc:“我要跟遥遥一起走~”
    jump:“那我就写一个程序来帮你们分组~”
    假设 cj 中学有 n 名 oier,每个人都有一个被称为“犇气”的数值,我们需要为
    出去游玩的 cjoier 进行组队,每支队伍最多两个人(不要问我为什么是两个人)。
    但是科学家发现,如果两只神犇呆在一起,他们的“犇气”就会发生剧烈的化学反
    应,威胁世界和平。为了世界和平与中国的可持续发展,每支队伍的“犇气”之和
    不能超过 C。现在 jump 要去屠题,没空解决这个问题,所以请你帮他求出信息
    组最少需要组建多少支队伍。

    输入数据

    第一行包含两个数 n,C;分别表示人数和每支队伍的犇气上限。
    接下来 n 行,每行一个数 ai,表示每个人的“犇气”值

    输出数据

    仅包含一个数,表示最小队伍数

    输入样例

    6 12
    7 2 9 3 7 6

    输出样例

    4

    数据规定

    对于 30%的数据,1<=n<=1000
    对于 100%的数据,1<=n<=300000,ai<=c 且保证 ai、c 均在 int 范围内。

    思路:

    这题实在是送分题,贪心入门题,类似我们做过的人过和....

    我们把数据输入后,把这些数据按犇值排一遍序

    然后我们设置一个头指针和尾指针,按照贪心的思想,我们要把犇值最大的和最小的相搭配;

    如果2人的犇值之和大于最大值,我们就把尾指针向前移一个,同时sum++,相当于那个犇值较大的单独一个队;

    如果2人犇值之和小于最大值,那么头指针向后移,尾指针向前移(题目规定最多2人一队)

    输出

    直接输出统计的sum

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    int n,m;
    int a[300010];
    int sum=0;
    int scan()
    {
        int as=0,fin=1;
        char c=getchar();
        while(c<'0'||c>'9'&&c!='-') c=getchar();
        if(c=='-') fin=-1;
        while(c>='0'&&c<='9')
        {
            as=(as<<3)+(as<<1)+c-'0';
            c=getchar();
        }
        return as*fin;
    }
    int main()
    {
        freopen("team.in","r",stdin);
        freopen("team.out","w",stdout);
        n=scan();
        m=scan();
        int head=1,tail=n;
        for(int i=1;i<=n;i++)
        {
            a[i]=scan();
        }
        sort(a+1,a+n+1);
        while(head<=tail)
        {
            if(head==tail) sum++,head++,tail--;
            else if(a[head]+a[tail]<=m) ++sum,head++,tail--;
            else if(a[head]+a[tail]>m) ++sum,tail--;        
        }
        cout<<sum;
        return 0;
    }
    /*
    思路:
    这题好像是贪心啊....
    那么我们就sort一下
    然后最大的和最小的匹配一下就可以了??
    试试大样例吧
    */
    代码在这里

    T4 llg 的农场(可以去评测)
    题目描述

    llg 是一名快乐的农民,他拥有一个很大的农场,并且种了各种各样的瓜果蔬菜,到了每年秋天,他就可以把所有蔬菜水果卖到市场上,这样他就可以获利。但今年他遇到了一个难题——有许多鸟来到了他的农场偷吃他的瓜果蔬菜。不知所措的 llg 只好求助于 jump,万能的 jump 于是给了 llg 一些稻草人(据说可以驱鸟)。每个庄稼都可以看做是坐标系里面的一个点,当它处于某个稻草人的范围内时就可以视为被保护。可是每个稻草人的辐射范围有限,根据测定,每个稻草人的辐射范围都是一个半径为 R 的圆,如下图:


    llg 很懒,所以他只打算把稻草人放在坐标系的 x 轴上,而任何庄稼(x,y)都满足 y>0。图中的小红点就是庄稼,蓝点即稻草人放的位置。现在请你来帮助 llg设计一个方案,用尽可能少的稻草人来保证所有庄稼都是安全的。若存在无法覆盖的庄稼或者 jump 给的稻草人不够覆盖所有庄稼,请输出-1。

    输入数据

    每个测试点含多组数据
    每组数据第一行包含 n,R,C;分别表示庄稼的数量、稻草人的最大覆盖半径,命题人:黎锦灏
    稻草人的数量。
    接下来 n 行,每行包括两个数 xi,yi 表示一个点的坐标
    输入以“0 0 0”结尾

    输出数据

    对于每组数据,请输出最小要用多少稻草人,才能保证覆盖所有庄稼。若无法覆
    盖或数量不够,请输出-1。

    输入样例

    3 2 3
    1 2
    -3 1
    2 1
    3 2 4
    1 3
    -3 1
    2 2
    0 0 0

    输出样例

    2
    -1

    数据规定

    对于 30%的数据,1<=n<=3000
    对于 100%的数据, 1<=n<=50000,1<=数据组数<=10,其余数据均保证不会超过 int
    的范围

    思路:

    solution说"这道题是用来 send meat 的水题。。。我也不知道这道题有什么部分分是可
    以拿的。。。"

    我也无语了.......

    有数学知识可知

    图中 ABCD 为庄稼的位置。假设稻草人半径为 2,那么能够覆盖 A 点(1,1)的
    稻草人一定处在以 A 为圆心,R 为半径的圆与 x 轴的两个交点之间。

    所以原题就转化了,我们现在的问题就是使每个区0间内有一个"圆心";

    然后我们就储存每个区间的左端点和右端点

    然后以左端点或右端点为依据来进行排序

    如果是以最左端排序,那么我们就保存最小的右端点,如果有区间的左端点大于右端点

    我们就对其进行更新,ans++;

    输出

    输出ans就可以了

    反思

    其实我的思路和题解的差不多,只是我数学实在是太suo了,想不到用区间来解决

    #include<bits/stdc++.h>
    using namespace std;
    int n,r,c;
    struct ss
    {
        double x,y;
    }a[50010];
    double dx,dy;
    int scan()
    {
        int as=0,fin=1;
        char c=getchar();
        while(c<'0'||c>'9')
            {
                if(c=='-') fin=-1;
                c=getchar();
            }
        while(c>='0'&&c<='9')
        {
            as=(as<<3)+(as<<1)+c-'0';
            c=getchar();
        }
        return as*fin;
    }
    bool cmp(ss i,ss j)
    {
        return i.x<j.x;
    }
    int main()
    {
        while(1)
        {
            n=scan();
            r=scan();
            c=scan();
            int fin=0;
            if(n==0&&r==0&&c==0) return 0;
            for(int i=1;i<=n;i++)
            {
                a[i].x=scan();
                a[i].y=scan();
                if(a[i].y>r)
                {
                    cout<<-1<<endl;
                    fin=1;
                }
                dx=sqrt(r*r*1.0-(a[i].y)*(a[i].y)*1.0);
                a[i].y=a[i].x+dx;
                a[i].x=a[i].x-dx;
            }
            if(fin==0)
            {
                sort(a+1,a+n+1,cmp);//左端点排序..
                int k,sum=0;
                k=1;
                for(int i=1;i<=n;i++)
                {
                    if(a[i].y<a[k].y) k=i;
                    if(a[i].x>a[k].y)
                        k=i,sum++;
                }
                if(sum+1<c)
                cout<<sum+1<<endl;
                else cout<<-1<<endl;
            }
        }
    }
    O(∩_∩)O~~,一遍过


    T1第一题 战役 battle

    题目描述

    公元 2045 年,C 国进入社会主义高级阶段,这引起了资本主义世界的恐慌。以 A 国为首的资本主义阵营集结了一支联军,企图迫使 C 国屈服。尽管 C 国热爱和平,但面对侵略势力,C 国举国抗击,打得联军节节败退。战役进行时,联军间谍破获了 C 国情报,得到了 C 国的粮草、装备部署情况。A 国统帅 LCF 企图摧毁 C 国的后勤供应。 C 国高层很快得知了联军的行动,当即派遣 ljh 将军和 LRH将军率兵紧急转移各大仓库的物资,并集中于一处重兵保护。现在已知所有的仓库的位置,而每个仓库都只储存了一种物资。(显然,有很多个仓库储存的是同一种物资。)A 国统帅 LCF 的思维比较简单,他认为只要储存某一种物资的所有仓库被摧毁,就可以断绝这种物资的供应,从而断绝 C 国的后勤供应。为了题目简单,我们不妨认为所有仓库集中在一条直线上(即 x 轴),现在ljh、LRH 将军急需在 x 轴上寻找一点作为物资集中地,然后把所有物资集中在此
    处。现共有 n 种物资,m 个仓库,物资运输的花费等于这个仓库到选定集中点的距离的平方。两位将军忙着组织军队保护物资转移,于是设计转移方案的重任就交到你头上了,你需要最小化物资转移的花费,并确定将物资集中在何处。

    输入数据

    输入第一行为两个整数 n,m,即物资的种类和仓库的个数。
    接下来的 m 行,每行两个整数 Xi,Pi,分别表示仓库 i 在 x 轴上的位置和仓库 i
    储存的是第 Pi 种物资(1<=Pi<=n)。
    输入保证每种物资都有仓库储存,注意可能有仓库位置可以重复。

    输出数据

    仅一行,输出选择的物资集中处的坐标(保留四位小数)
    如果有多个坐标使得最小花费相同,请输出最小的那个坐标。

    输入样例

    3 5
    -1 3
    0 1
    2 3
    4 2
    5 2

    输出样例

    2.0000

    数据约定

    对于 30%的数据,1<=n<=15,1<=m<=20,存储同一种物资的仓库不超过 10 种;
    对于 100%的数据,1<=n<=20000,1<=m<=200000,|xi|<=200000

    思路

    这道题是由HL讲的,虽然有点蒙,但是还可以吧.....大致思路还是听懂了

    后来看了下DTT的博客,也就差不多吧

     

  • 相关阅读:
    建模算法(九)——拟合 (转)
    Swift初探一
    D3DXMatrixMultiply 函数
    魔术师发牌和拉丁方阵
    strip 命令的使用方法
    GDI编程小结
    Android多媒体-MediaRecorder 录制音视频
    Android 使用Gson解析json案例具体解释
    有依赖的背包问题(背包九讲)
    c++ 正則表達式
  • 原文地址:https://www.cnblogs.com/KSTT/p/10338304.html
Copyright © 2011-2022 走看看