Codeforces Round #665 (Div. 2)

A.Distance and Axis

题意:给你一个n,k。在坐标轴上有O点(x=0),A点(x=n),还有一个未知点B,求abs(|OB|-|BA|)=k,即O点到B的距离和B到A的距离等于k,有时候点A并不会满足条件,你要做的就是让A移动-1或者+1,满足条件。求最小的移动次数

思路

  1. 当n<=k的时候res=k-n,因为要满足条件必须把A移到k,这样点B在0或者k都能满足条件。
  2. n>k的时候,需要判断n,k的奇偶性,
    1. n奇数
      1. k奇数 res=0
      2. k偶数 res=1
    2. n偶数
      1. k奇数 res=1
      2. k偶数 res=0
#include<bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
typedef long long ll;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
	ios::sync_with_stdio(false);
    int _;
    cin>>_;
    while(_--)
    {
        int n,k;
        cin>>n>>k;
        if(n==k)cout<<0;
        else if(n>k)
        {
            if(n&1)
            {
                if(k&1)cout<<0;
                else cout<<1;
            }else{
                if(k&1)cout<<1;
                else cout<<0;
            }
        }
        else cout<<abs(n-k);
        cout<<"\n";
    }
	return 0;
 } 

B.Ternary Sequence

题意:两个序列a和b,其中a序列和b序列中只有0,1,2的元素。给你x0,x1,x2是a中0,1,2的个数,y0,y1,y2是b中0,1,2的个数。C满足以下条件:

  1. ai*bi ai>bi
  2. 0 ai=bi
  3. -ai*bi ai<bi

求满足条件的C的数组之和,保证和最大。

思路:只有(2,1)能贡献答案,所以我们首先让(2,1)尽可能多,同时让(1,2)尽可能少,通过更多的(1,0)和(0,2)来减少(1,2)。

#include<bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
typedef long long ll;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
	ios::sync_with_stdio(false);
    int _;
    cin>>_;
    while(_--)
    {
        int x0,x1,x2,y0,y1,y2,m1,m2,m3;
        cin>>x0>>x1>>x2>>y0>>y1>>y2;
        m1=min(x2,y1);
        x2-=m1;y1-=m1;
        m2=min(x0,y2);
        x0-=m2;y2-=m2;
        m3=min(x1,y0);
        x1-=m3;y0-=m3;
        int res=2*m1-2*min(x1,y2);
        cout<<res<<"\n";
    }
	return 0;
 } 

C. Mere Array

题意:给你一个数组a,minx是数组中的最小元素,当gcd(a[i],a[j])==minx,那么你可以交换a[i],a[j]使得数组变成不降序序列。你只需要回答是否可以通过这种操作满足不降序的序列。

思路:对数组排个序,说明此时是满足条件,我们遍历数组寻找被移动过的元素,能否被minx整除,不能则NO,能则YES。因为能被minx整除的都可以间接的交换位置。

#include<bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
typedef long long ll;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int a[N],b[N];
int main()
{
	// ios::sync_with_stdio(false);
    int _;
    cin>>_;
    while(_--)
    {
        int n,minx=1e9+7;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            minx=min(minx,a[i]);
            b[i]=a[i];
        }
        sort(a,a+n);
        bool flag=false;
        for(int i=0;i<n;i++)
        {
            if(a[i]==b[i])continue;
            if(a[i]%minx==0)continue;
            flag=true;break;
        }
        if(flag)cout<<"NO";
        else cout<<"YES";
        cout<<"\n";
    }
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值