每场cf不管打的多菜还是记录一下…,不然感觉打了跟没打没啥区别
题目链接
一个OX坐标系(即:只有正坐标),有一点A,坐标为n,给定一数值k,问是否存在点B使得|OB|-|AB|的绝对值等于k。
当然可能找不到点B,于是有一操作可以对A的坐标加一或者减一。
问需要操作几次才能找到点B符合题意
#include
#define ll long long
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
int main(){
int t,n,k;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
if(n<k) printf("%d\n",k-n);
else{
if(n%2==k%2) printf("0\n");
else printf("1\n");
}
}
}
题目链接
a,b数组均由若干0,1,2组成,且a,b数组长度相同。现给出a,b数组的0,1,2数量,需要你构成c数组,其中有一规则:
需要求c数组和的最大值
尽可能让a数组的2与b数组的1相组合,让a数组的1和b数组的2相远离。
#include
#define ll long long
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
int main() {
int t,x1,y1,z1,x2,y2,z2;
cin>>t;
while(t--) {
cin>>x1>>y1>>z1>>x2>>y2>>z2;
int x=min(z1,y2); //2--1
int ans=2*x;
z1-=x,y2-=x;
x=min(y1,x2); //1---0
y1-=x,x2-=x;
x=min(x1,z2); //0---2
x1-=x,z2-=x;
x=min(y1,z2); //1---2
ans-=2*x;
printf("%d\n",ans);
}
return 0;
}
题目链接
给定一长度为n的数组a,有一种操作:如果数组中某两个元素的gcd刚好等于该数组的最小元素,则可以交换这两个元素的位置。判断最终数组是否能构成非降序。
可以用两个数组存数组中能够被最小元素整除的位置pos[]和值num[]
接下来对保存的数组num进行从小到大排序,由于需要判断是否构成非降序,只需将能被最小元素整除的元素按照排序后的顺序依次放入原来数组pos之前对应的位置(有点绕,具体见代码)
最终遍历整个数组,判断是否构成非降序
#include
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+5;
int a[maxn],pos[maxn],num[maxn];
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int minnum=inf;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
minnum=min(minnum,a[i]);
}
int cnt=0;
for(int i=1;i<=n;i++){
if(a[i]%minnum==0){
pos[++cnt]=i;num[cnt]=a[i];
}
}
sort(num+1,num+cnt+1);
for(int i=1;i<=cnt;i++){
a[pos[i]]=num[i];
}
int flag=0;
for(int i=1;i<n;i++){
if(a[i]>a[i+1]){
flag=1;break;
}
}
if(flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}