• 2017-10-26 NOIP模拟赛2


    财富

    (treasure)

    Time Limit:1000ms   Memory Limit:128MB

    题目描述

    LYK有n个小伙伴。每个小伙伴有一个身高hi。

    这个游戏是这样的,LYK生活的环境是以身高为美的环境,因此在这里的每个人都羡慕比自己身高高的人,而每个人都有一个属性ai表示它对身高的羡慕值。

    这n个小伙伴站成一列,我们用hi来表示它的身高,用ai来表示它的财富。

    每个人向它的两边望去,在左边找到一个最近的比自己高的人,然后将ai朵玫瑰给那个人,在右边也找到一个最近的比自己高的人,再将ai朵玫瑰给那个人。当然如果没有比自己身高高的人就不需要赠送别人玫瑰了。也就是说一个人会给0,1,2个人玫瑰(这取决于两边是否有比自己高的人)。

    每个人都会得到若干朵玫瑰(可能是0朵),LYK想知道得了最多的玫瑰的那个人得了多少玫瑰。(然后嫁给他>3<)

    输入格式(treasure.in)

        第一行一个数n表示有n个人。

        接下来n行,每行两个数hi,ai。

    输出格式(treasure.out)

        一个数表示答案。

    输入样例

    3

    4 7

    3 5

    6 10

    输出样例

    12

    样例解释

    第一个人会收到5朵玫瑰,第二个没人送他玫瑰,第三个人会收到12朵玫瑰。

    数据范围

    对于50%的数据n<=1000,hi<=1000000000。

    对于另外20%的数据n<=50000,hi<=10。

    对于100%的数据1<=n<=50000,1<=hi<=1000000000。1<=ai<=10000。

    #include<iostream>
    #include<cstdio>
    #define maxn 50001
    using namespace std;
    int n,h[maxn],a[maxn],w[maxn],ans;
    int qread(){
        int i=0;
        char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch<='9'&&ch>='0')i=i*10+ch-'0',ch=getchar();
        return i;
    }
    int main(){
        freopen("treasure.in","r",stdin);freopen("treasure.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            h[i]=qread();a[i]=qread();
        }
        for(int i=1;i<=n;i++){
            for(int j=i-1;j>=1;j--){
                if(h[j]>h[i]){
                    w[j]+=a[i];
                    ans=max(ans,w[j]);
                    break;
                }
            }
            for(int j=i+1;j<=n;j++){
                if(h[j]>h[i]){
                    w[j]+=a[i];
                    ans=max(ans,w[j]);
                    break;
                }
            }
        }
        printf("%d",ans);
        return 0;
    }
    100分 穷举(这题卡scanf)

    正方形

    (square)

    Time Limit:1000ms   Memory Limit:128MB

    题目描述

    在一个10000*10000的二维平面上,有n颗糖果。

    LYK喜欢吃糖果!并且它给自己立了规定,一定要吃其中的至少C颗糖果!

    事与愿违,LYK只被允许圈出一个正方形,它只能吃在正方形里面的糖果。并且它需要支付正方形边长的价钱。

    LYK为了满足自己的求食欲,它不得不花钱来圈一个正方形,但它想花的钱尽可能少,你能帮帮它吗?

    输入格式(square.in)

        第一行两个数C和n。

        接下来n行,每行两个数xi,yi表示糖果的坐标。

    输出格式(square.out)

        一个数表示答案。

    输入样例

    3 4

    1 2

    2 1

    4 1

    5 2

    输出样例

    4

    样例解释

    选择左上角在(1,1),右下角在(4,4)的正方形,边长为4。

    数据范围

    对于30%的数据n<=10。

    对于50%的数据n<=50。

    对于80%的数据n<=300。

    对于100%的数据n<=1000。1<=xi,yi<=10000。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,C,mid,ans;
    struct node{
        int x,y;
        bool operator < (const node b)const{
            if(x!=b.x)return x<b.x;
            else return y<b.y;
        }
    }a[10010];
    int w[10010];
    bool count(int l,int r){
        if(r-l+1<C)return 0;
        int cnt=0;
        for(int i=l;i<=r;i++)w[++cnt]=a[i].y;
        sort(w+1,w+cnt+1);
        for(int i=C;i<=cnt;i++)
            if(w[i]-w[i-C+1]<=mid)return 1;
        return 0;
    }
    bool check(){
        int l=1;
        for(int i=1;i<=n;i++){
            if(a[i].x-a[l].x>mid){
                if(count(l,i-1))return 1;
                while(a[i].x-a[l].x>mid)l++;
            }
        }
        if(count(l,n))return 1;
        return 0;
    }
    int main(){
        freopen("square.in","r",stdin);freopen("square.out","w",stdout);
        //freopen("Cola.txt","r",stdin);
        scanf("%d%d",&C,&n);
        for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
        sort(a+1,a+n+1);
        int l=1,r=10000;
        while(l<=r){
            mid=(l+r)>>1;
            if(check())ans=mid,r=mid-1;
            else l=mid+1;
        }
        printf("%d",ans+1);
    }
    100分 二分答案

    追逐

    (chase)

    Time Limit:1000ms   Memory Limit:128MB

    题目描述

    这次,LYK以一个上帝视角在看豹子赛跑。

    在一条无线长的跑道上,有n只豹子站在原点。第i只豹子将在第ti个时刻开始奔跑,它的速度是vi/时刻。

    因此在不同的时刻,这n只豹子可能在不同的位置,并且它们两两之间的距离也将发生变化。

    LYK觉得眼光八方太累了,因此它想找这么一个时刻,使得最远的两只豹子的距离尽可能近,当然这不能是第0时刻或者第0.01时刻。它想知道的是最迟出发的豹子出发的那一刻开始,离得最远的两只豹子在距离最小的时候这个距离是多少。

    当然这个时刻不仅仅可能发生在整数时刻,也就是说可能在1.2345时刻这个距离最小。

    输入格式(chase.in)

        第一行一个数n。

        接下来n行,每行两个数分别是ti和vi。

    输出格式(chase.out)

        输出一个数表示答案,你只需保留小数点后两位有效数字就可以了。

    输入样例

    3

    1 4

    2 5

    3 7

    输出样例

    0.33

    样例解释

    在第5+2/3这个时刻,第一只豹子在18+2/3这个位置,第二只豹子在18+1/3这个位置,第三只豹子在18+2/3这个位置,最远的两只豹子相距1/3的距离,因此答案是0.33。

    数据范围

    对于20%的数据n=2。

    对于20%的数据n=3

    对于60%的数据n<=100。

    对于80%的数据n<=1000。

    对于100%的数据n<=100000,1<=vi,ti<=100000。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<ctime>
    #define maxn 100010
    using namespace std;
    int n;
    double mx,mn=1000000000,t[maxn],v[maxn],tim,ans=1000000000,s[maxn];
    int main(){
        freopen("chase.in","r",stdin);freopen("chase.out","w",stdout);
        //freopen("Cola.txt","r",stdin);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%lf%lf",&t[i],&v[i]),tim=max(tim,t[i]);
        for(int i=1;i<=n;i++){
            s[i]=v[i]*(tim-t[i]);
            mx=max(mx,s[i]);mn=min(mn,s[i]);
            
        }
        ans=min(ans,fabs(mx-mn));
        while(clock()<=970){
            tim+=0.001;
            mx=0,mn=1000000000;
            for(int i=1;i<=n;i++){
                s[i]=v[i]*(tim-t[i]);
                mx=max(mx,s[i]);mn=min(mn,s[i]);
            }ans=min(ans,fabs(mx-mn));
        }
        printf("%.2lf",ans);
    }
    10分 暴力
  • 相关阅读:
    pytorch中的detach和detach_
    matlab求导
    Introduction to the Tcl command language
    Tcl/Tk学习
    利用char, str2mat, strvcat创建多行字符串数组
    矩阵操作
    matlab创建三对角线矩阵
    TensorFlow v2.0的基本张量操作
    数据科学家应知道的关于数据科学项目的四个关键方面
    使用TensorFlow v2库实现线性回归
  • 原文地址:https://www.cnblogs.com/thmyl/p/7736497.html
Copyright © 2020-2023  润新知