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

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

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

posted @ 2019-06-12 00:06  浅花迷人  阅读(169)  评论(0编辑  收藏  举报