zoukankan      html  css  js  c++  java
  • contest 1169(div 2)

    B. Pairs

    题面描述:

    给你m对数,每一个数都在1和n之间,问是否存在两个数x和y,对于每一对数来说,至少存在一个数与x或y相等。如果存在输出 “YES”,否则输出“NO”

    思路:

    首先,第一对数中至少存在x或y中的一个,分别赋值给a和b,同时,x,y中的另一个数可能是a , b 中的另一个,也可能是与第一对数完全不同的一对数中的一个,将这对数赋值给c,d,那么x,y如果存在,一定在a,b,c,d这四个数之间,枚举所有可能,查看是否符合条件即可。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 3e5+5;
    pair< int ,int > pa[maxn];
    int n,m;
    bool check(int a,int b)
    {
        for(int i = 0;i < m;i++)
        {
            if(pa[i].first != a && pa[i].first != b && pa[i].second != a && pa[i].second != b) return  false;
        }
        return true;
    }
    int main()
    {
        cin >> n >> m;
        int a,b,c = 0,d = 0;
        for(int i = 0;i < m;i++)
        {
            scanf("%d %d",&pa[i].first,&pa[i].second);
            if(i == 0) a = pa[i].first,b = pa[i].second;
            if(a != pa[i].first && a != pa[i].second && b != pa[i].first && b != pa[i].second)
             c = pa[i].first,d = pa[i].second;
        }
        bool flag = false;
        if(check(a,b)||check(a,c)||check(a,d)||check(b,c)||check(b,d) ) flag = true;
        if(flag) cout << "YES" << endl;
        else cout << "NO" << endl;
        return 0;
    }

    C. Increasing by Modulo

    题目描述

    给你一个数组,数组中每一个元素都在0和n-1之间,定义一种操作,你选取数组中j个数,将每个数都执行+1然后mod m的操作,输出将该数组改变为非递减数组的最小步数。

    思路:

    二分答案,判断二分出的答案是否符合条件,不断更新最小值。设当前数组的最大值为last,假如第一个数在进行x操作的过程中可以等于零,我们可以直接让last等于零,否则,应该让他等于num[0],这样可以方便讨论。接下来,对于数组中的每一个数,如果它进行完x次操作以后还是不能比前面最大的值大,则一定不符合条件,直接返回false,接下来,就应该考虑如何更新last的值了,如果num[i[在进行x次操作中能等于last,那就保持last不变即可,接下来,如果num[i]+x大于last但是小于m或者mod m以后依然小于last,本着最小化last的想法,我们应该让last直接等于num[i],还有一种情况就是 (num[i]+x) 大于m且mod m以后大于last,那么就应该维持last保持不变,集体实现请参照下列代码。

     AC代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 3e5+5;
    int n,m;
    int num[maxn];
    bool check(int x)
    {
        int last = -1;
        if(num[1]+x>=m) last = 0;
        else
            last = max(last,num[1]);
        for(int i = 2;i<=n;i++)
        {
            if(num[i]+x>=last)
            {
                if(num[i]<=last)
                    continue;
                else if(num[i]+x<m)
                    last = num[i];
                else if((num[i]+x)%m<last)
                    last = num[i];
                else
                    last  =last;
            }
            else
                return false;
        }
        return true;
    }
    int main()
    {
        cin >> n >>  m;
        for(int i = 1;i<=n;i++)
            cin >> num[i];
        int l = 0,r = m,res = m;
        while(l<=r)
        {
            int mid = (l+r)/2;
            //cout << mid << ": " << check(mid) << endl;
            if(check(mid))
            {
                r = mid-1;
                res = min(mid,res);
            }
            else
                l = mid+1;
        }
        cout << res << endl;
        return 0;
    }

    ————————————————————————————————————————————————————————

    事实已经是这样了,但生活还要继续啊,虽然无论你做什么,她都回不来了。

  • 相关阅读:
    rs
    stm32f767 usoc3
    stm32f767 RTT 日志
    stm32f767 标准库 工程模板
    stm32f767 HAL 工程模板
    docker tab 补全 linux tab 补全
    docker anconda 依赖 下载 不了
    docker run 常用 指令
    linux scp 命令
    Dockerfile 常用参数说明
  • 原文地址:https://www.cnblogs.com/baihualiaoluan/p/11005972.html
Copyright © 2011-2022 走看看