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;
    }

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

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

  • 相关阅读:
    ros论坛
    python--dict和set类型--4
    python--条件判断和循环--3
    python--list和tuple类型--2
    Unicode与UTF-8互转(C语言实现)
    spring mvc 返回JSON数据
    值得学习的C语言开源项目和库
    mudos源码分析
    Freemarker使用总结
    Maven详解
  • 原文地址:https://www.cnblogs.com/baihualiaoluan/p/11005972.html
Copyright © 2011-2022 走看看