题意:给你一个n,k。在坐标轴上有O点(x=0),A点(x=n),还有一个未知点B,求abs(|OB|-|BA|)=k,即O点到B的距离和B到A的距离等于k,有时候点A并不会满足条件,你要做的就是让A移动-1或者+1,满足条件。求最小的移动次数
思路:
- 当n<=k的时候res=k-n,因为要满足条件必须把A移到k,这样点B在0或者k都能满足条件。
- n>k的时候,需要判断n,k的奇偶性,
- n奇数
- k奇数 res=0
- k偶数 res=1
- n偶数
- k奇数 res=1
- k偶数 res=0
- n奇数
#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;
}
题意:两个序列a和b,其中a序列和b序列中只有0,1,2的元素。给你x0,x1,x2是a中0,1,2的个数,y0,y1,y2是b中0,1,2的个数。C满足以下条件:
- ai*bi ai>bi
- 0 ai=bi
- -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;
}
题意:给你一个数组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;
}