• Educational Codeforces Round 85 (Rated for Div. 2)



    题外话

    最近要多打cf ,十分容易上分的哈

    A

    A.题意

    给你两个数值, 要求就是第一个要大于第二个, 且上一次的要小于这一次的

    A.思路

    按照题意模拟就行
    

    A.代码

    #include <bits/stdc++.h>
    #include <ext/pb_ds/assoc_container.hpp>
    #include <ext/pb_ds/tree_policy.hpp>
    #define iinf 0x3f3f3f3f
    #define linf (1ll<<60)
    #define eps 1e-8
    #define maxn 1000010
    #define maxe 1000010
    #define cl(x) memset(x,0,sizeof(x))
    #define rep(i,a,b) for(i=a;i<=b;i++)
    #define drep(i,a,b) for(i=a;i>=b;i--)
    #define em(x) emplace(x)
    #define emb(x) emplace_back(x)
    #define emf(x) emplace_front(x)
    #define fi first
    #define se second
    #define pb push_back
    #define de(x) cerr<<#x<<" = "<<x<<endl
    #define __i __int128
    using namespace std;
    using namespace __gnu_pbds;
    typedef long long ll;
    typedef pair<int,int> pii;
    //typedef pair<ll,ll> pll;
    //
    //ll read(ll x=0)
    //{
    //    ll c, f(1);
    //    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    //    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    //    return f*x;
    //}
    const int N =100010;
    ll   n , k  , m ;
    void clear(unsigned char *pta, int size )
    {
        while(size>0)
        {
            *pta++ = 0;
            size --;
        }
    }
    ll ar[200010] , num =0 ;
    ll br[200010],cr[200010];
    struct node {
        int x , y;
        double num;
    }p[100010];
    double cmp(node a , node b){
        return a.y*b.x>b.y*a.x;
    }
    int main()
    {
    	    ios::sync_with_stdio(0);
            cin.tie(0), cout.tie(0);
            cin>>n;
            while(n--){
                cin >>m;
                int pos =0 , num =0 ;int flag =1 ;
                for(int i=0;i<m;i++){
                 int a,b; cin >>a >>b;
                 if(pos >a || num >b||b-num> a -pos)flag =0 ;
                    pos =a, num =b;
                }
                if(flag )cout<<"YES"<<endl;
                else cout<<"NO"<<endl;
            }
                return 0;
    }
    
    

    B

    B.题意

    给你一组数, 问你通过平分, 可以搞出来多少大于等于k的数

    B.思路

    直接sort 排序就,然后平分就行

    B.代码

    #include <bits/stdc++.h>
    #include <ext/pb_ds/assoc_container.hpp>
    #include <ext/pb_ds/tree_policy.hpp>
    #define iinf 0x3f3f3f3f
    #define linf (1ll<<60)
    #define eps 1e-8
    #define maxn 1000010
    #define maxe 1000010
    #define cl(x) memset(x,0,sizeof(x))
    #define rep(i,a,b) for(i=a;i<=b;i++)
    #define drep(i,a,b) for(i=a;i>=b;i--)
    #define em(x) emplace(x)
    #define emb(x) emplace_back(x)
    #define emf(x) emplace_front(x)
    #define fi first
    #define se second
    #define pb push_back
    #define de(x) cerr<<#x<<" = "<<x<<endl
    #define __i __int128
    using namespace std;
    using namespace __gnu_pbds;
    typedef long long ll;
    typedef pair<int,int> pii;
    //typedef pair<ll,ll> pll;
    //
    //ll read(ll x=0)
    //{
    //    ll c, f(1);
    //    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    //    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    //    return f*x;
    //}
    const int N =100010;
    ll   n , k  , m ;
    void clear(unsigned char *pta, int size )
    {
        while(size>0)
        {
            *pta++ = 0;
            size --;
        }
    }
    ll ar[200010] , num =0 ;
    ll br[200010],cr[200010];
    struct node {
        int x , y;
        double num;
    }p[100010];
    int cmp (int a , int b ){
    return a > b;}
    int main()
    {
    	    ios::sync_with_stdio(0);
            cin.tie(0), cout.tie(0);
            cin>>n;
            while(n--){
                ll sum =0 ;
              cin >>m>>k;for(int i=0;i<m;i++)cin>>ar[i];
            sort(ar,ar+m,cmp);ll num =0;
            for(int i=0;i<m;i++){
                if((num+ar[i])<k*(i+1))break;
                num +=ar[i];
                sum ++ ;
            }cout<<sum <<endl;
            }
                return 0;
    }
    
    

    C

    C.题意

    给你n个怪物的血量和死亡后给后面怪物造成的伤害,(你每一次只能给怪物造成一点伤害),这n个怪物围绕成园,问你最少要多少发子弹能全杀死
    

    C.思路

    一开始,只知道应该是贪心, 但是如何贪心没有想出来。然后看了看题解,发现其实只需要确定第一个怪物(你要杀死的就行,后面其实都确定好了)
    - 第一个怪物一定会给后面的怪物造成的伤害是最大的(这样你接下来打出的子弹会减少很多)
    - 接下来就是补刀的过程, 哪个没死就给他一枪
    - 具体做法就是, 记录一下每个怪物因为前面死亡后减少的血量是多少(存一下和), 然后找到一个最多的, 这个就是第一个你要杀死的(用前面的和减去这个差值),加上开枪的次数
    - 时间复杂度是O(n)

    C.代码

    #include <bits/stdc++.h>
    #include <ext/pb_ds/assoc_container.hpp>
    #include <ext/pb_ds/tree_policy.hpp>
    #define iinf 0x3f3f3f3f
    #define linf (1ll<<60)
    #define eps 1e-8
    #define maxn 1000010
    #define maxe 1000010
    #define cl(x) memset(x,0,sizeof(x))
    #define rep(i,a,b) for(i=a;i<=b;i++)
    #define drep(i,a,b) for(i=a;i>=b;i--)
    #define em(x) emplace(x)
    #define emb(x) emplace_back(x)
    #define emf(x) emplace_front(x)
    #define fi first
    #define se second
    #define pb push_back
    #define de(x) cerr<<#x<<" = "<<x<<endl
    #define __i __int128
    using namespace std;
    using namespace __gnu_pbds;
    typedef long long ll;
    typedef pair<int,int> pii;
    //typedef pair<ll,ll> pll;
    //
    //ll read(ll x=0)
    //{
    //    ll c, f(1);
    //    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    //    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    //    return f*x;
    //}
    const int N =300010 ;
    ll   n , k  , m ;
    void clear(unsigned char *pta, int size )
    {
        while(size>0)
        {
            *pta++ = 0;
            size --;
        }
    }
    ll ar[N] , num =0 ;
    ll br[N],c[N];
    struct node {
        int x , y;
        double num;
    }p[100010];
    int cmp (int a , int b ){
    return a > b;}
    int main()
    {
    	    ios::sync_with_stdio(0);
            cin.tie(0), cout.tie(0);
            cin >>n;
            while(n--){
                cin >>m;ll sum =0 ;
                for(int i=0;i<m;i++){
                    cin >>ar[i]>>br[i];
                }
                for(int i=0;i<m;i++){
                    if(!i)c[i] = max(0ll ,ar[0] - br[m-1]);
                    else c[i] = max(0ll , ar[i] - br[i-1]);
                    sum +=c[i];
                }
                 ll num =1e18 ;
                for(int i=0 ;i<m;i++){
                    num = min(num, sum - c[i] + ar[i]);
                }
                cout<<num<<endl;
            }
                return 0;
    }
    

    D

    D.题意

    问你是否可以从1 开始走过所有边 (走过的边不能再走)

    D.思路

    • 一看这样应该要知道是个欧拉回路我没看出来
    • 然后看提示 发现当有三条边的时候 是这样的1 2 1 3 2 3 1
    • 然后会发现 , 把每一个点作为开头的分为一组 例如 1 2 1 3 | 2 3 | 1
    • 此时你会发现每个组是$ 2*(n-i) $
    • 之后前缀和+ 二分即可
    • 时间复杂度O(n)

    D代码

    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <set>
    #include <queue>
    #include <cstring>
    #include <cassert>
    #include<map>
    #define cl(x) memset(x,0,sizeof(x))
    #define rep(i,a,b) for(i=a;i<=b;i++)
    #define drep(i,a,b) for(i=a;i>=b;i--)
    #define em(x) emplace(x)
    #define emb(x) emplace_back(x)
    #define emf(x) emplace_front(x)
    #define fi first
    #define se second
    #define pb push_back
    #define de(x) cerr<<#x<<" = "<<x<<endl
    #define __i __int128
    #define FOR(i, x, y) for (decay<decltype(y)>::type i = (x), _##i = (y); i < _##i; ++i)
    #define FORD(i, x, y) for (decay<decltype(x)>::type i = (x), _##i = (y); i > _##i; --i)
    #ifdef zerol
    #define dbg(x...) do { cout << "33[32;1m" << #x << " -> "; err(x); } while (0)
    
    #else
    #define dbg(...)
    #endif
    using namespace std;
    //using namespace __gnu_pbds;
    typedef long long ll;
    typedef pair<int,int> pii;
    void err() { cout << "33[39;0m" << endl; }
    template<template<typename...> class T, typename t, typename... A>
    void err(T<t> a, A... x) { for (auto v: a) cout << v << ' '; err(x...); }
    template<typename T, typename... A>
    void err(T a, A... x) { cout << a << ' '; err(x...); }
    //typedef pair<ll,ll> pll;
    //
    //ll read(ll x=0)
    //{
    //    ll c, f(1);
    //    for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
    //    for(;isdigit(c);c=getchar())x=x*10+c-0x30;
    //    return f*x;
    //}
    const int N =100010;
    ll   n , k  , m ;
    void clear(unsigned char *pta, int size )
    {
        while(size>0)
        {
            *pta++ = 0;
            size --;
        }
    }
    ll MOD=1e9+7;
    ll ar[N];
    ll dfs(ll x){
        if(x > ar[m-1])return 1;
        auto a =lower_bound(ar+1,ar+m,x)-ar;
        int b = x -ar[a-1];
        if(b&1)return a;
        else return b/2+a;
    }
    int main()
    {
    	    ios::sync_with_stdio(0);
            cin.tie(0), cout.tie(0);
            cin >>n;
            while(n--){
                ll l, r;
                cin >>m>>l>>r;
                ll i ;
                rep(i,1 ,m+1)ar[i] = ar[i-1] +2*(m-i);
    //            for(int i=0;i<=m;i++)cout<<ar[i]<<" ";
                rep(i,l , r)cout<<dfs(i)<<" ";
                cout<<endl;
            }
    
                return 0;
    }
    
  • 相关阅读:
    GAIN: Gradient Augmented Inpainting Network for Irregular Holes
    Python+Selenium实现对浏览器的自动操作
    python 中的内置类属性__name__和__doc__
    Python 装饰器
    Free-Form Image Inpainting with Gated Convolution
    解决ubuntu安装软件has install-snap change in progress错误
    Image Inpainting for Irregular Holes Using Partial Convolutions
    理解卷积
    Hive中分区表修复问题
    B2B、B2C、C2C、O2O分别是什么意思?
  • 原文地址:https://www.cnblogs.com/gaohaoy/p/12711307.html
Copyright © 2020-2023  润新知