HRBU_20211101训练
A - Era
题意
在一组数中任意插入几个数,是这组数满足a i<= i;并且下标是从1开始的,问需要插入几个数,才能满足于上述条件。
思路
求出a[i]-i的最大值,就是为了比较该数与数的下标相差多少,如果相等的话,说明该数就是数的下标的值,只需要比较出最大值即可,举例说明一下:
1 2 3 4 5;每个数的下标与数的差值均为零,可以看出a[i]==i;
1 2 3 4 6;可以看出只有数字6与数字下标5相差1,而在这里只需要补充一个5即可,即只需要补充一个数字即可。
代码
#include<stdio.h>
#include<iostream>
using namespace std;
int a[105];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ans=max(ans,a[i]-i);
}
printf("%d\n",ans);
}
}
B - XOR Specia-LIS-t
题意
一组数列,要求分成几组使得分成的子序列均是按照升序排列,例如,2,5,3,1,4 的数列,可以分为 2 5,3,1 4,三组,再把分成的组的个数作异或操作,如果结果是零输出NO,否则输出YES。
思路
如果该数列已经是升序,就分成零个子序列,输出NO,如果是奇数也是输出NO,因为总有一个子序列为零。
代码
#include<stdio.h>
#include<iostream>
int a[100005];
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,i;
cin>>n;
int flag=0;
for( i=1;i<=n;i++)
{
cin>>a[i];
if(i>0)
if(a[i]<=a[i-1])flag=1;
}
cout<<((n%2==0) || flag?"YES\n":"NO\n");
}
}
C - Di-visible Confusion
题意
判断一个数是否可以被下标加一除完,a[i]%(i+1)==0,能被整除完输出NO,判断是否所有的都能被整除完,且数列中的每一个都能被整除完时,应该把这个数移除,后面的数前进一位。
思路
依次遍历看看是否每一个都能被整除,若能输出NO,不能输出YES
代码
#include<stdio.h>
#include<iostream>
using namespace std;
int a[100005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int flag=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
int k=0;
while(a[i]%(i+1-k)==0 && k<=i-1)k++;
if(k==i)flag=1;
}
if(flag==0)
printf("YES\n");
else
printf("NO\n");
}
}
D - Moderate Modular Mode
题意
题目意思很简单,输出一个n ,使得 (n % x)== (y % n);
问n是多少?
思路
分情况讨论:
若x>y 输出 X+Y;
若x<=y,输出y- y%x/2;
代码
#include<stdio.h>
#include<iostream>
#define ll long long
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int x,y;
cin>>x;
cin>>y;
//n % x == y % n
cout<<(x>y?y+x:y-y%x/2)<<endl;
}
}
总结
每个人的人生都存在着起伏,在低谷时积蓄力量,在顶峰时绽放光彩!希望我能做到!