大家好,我是lcj 没错 我又来骗访客量了 hhhhh
每次div3都挺欢乐的
A 添加链接描述
题意 输入n m 每次n的操作可以是n+任意奇数 或者n-任意偶数
问你最少操作多少次使得n=m
题解 先判断n m基偶性 以及大小 最多两次 很明显
int main(){
ll t=read();
while(t--){
ll n=read();
ll m=read();
if(n==m){
printf("0\n");
continue;
}
if((m>n&&(m-n)%2==1)||(m<n&&(n-m)%2==0)){
printf("1\n");
continue;
}
printf("2\n");
}
return 0;
}
B题 添加链接描述
题意 输入n m代表a p数组长度 然后输入a p数组元素
规则如下 a[pi] and a[pi+1] 可以互换 前提没越界 可以操作无限次 问你最终a数组能不能从左往右一直不递减
思路 :冒泡法嘛 因为也就最多100个数 我们可以跑999次 对a数组的交换 然后输出的时候判断下ai ai+1的大小即可 很直观暴力
#include<bits/stdc++.h>
#define ll long long
#define mod 100006
#define IOS ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
inline ll read(){
char c=getchar();
ll f=1,x=0;
while(c<'0'||c>'9'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x*f;
}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}//最大公因数
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/
const int manx=109;
ll a[manx],b[manx],vis[manx];
int main()
{
ll p=read();
while(p--){
memset(vis,0,sizeof(vis));
ll n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++) b[i]=read(),vis[b[i]]=1;
ll num=1;
while(num){
num=0;
for(int i=1;i<=n;i++)
if(vis[i]){
if(a[i]>a[i+1])
num=1,swap(a[i],a[i+1]);
}
}
int ans=0;
for(int i=1;i<n;i++){
if(a[i]>a[i+1])
ans=1;
}
if(ans) printf("NO\n");
else printf("YES\n");
}
return 0;
}
C 添加链接描述
前缀和的运用
题意 给出一个字符串,再给出m个子串,求子串和原串个字母出现的次数
题解:前缀和
int dp[200010][30],cnt[30];
char s[200010];
int main()
{
int t,n,m;
cin>>t;
while(t--)
{
cin>>n>>m;
scanf("%s",s+1);
for(int i=1; i<=n; i++)
{
for(int j=0; j<26; j++)
dp[i][j]=0;
}
for(int i=1; i<=n; i++)
{
dp[i][s[i]-'a']++;
for(int j=0; j<26; j++)
{
dp[i][j]+=dp[i-1][j];//前缀和数组
}
}
for(int i=0; i<26; i++)
{
cnt[i]=dp[n][i];//二维压缩成最后的一维
}
while(m--)
{
int pos;
cin>>pos;
for(int i=0; i<26; i++)
{
cnt[i]+=dp[pos][i];
}
}
for(int i=0; i<25; i++)
{
cout<<cnt[i]<<" ";
}
cout<<cnt[25]<<endl;
}
return 0;
}
D 添加链接描述
输入t组数据 输入a b c 问b%a=0 c%b=0 全体最小的变化量是多少 以及输出满足条件的a1 b1 c1
题解:三重循环 枚举 i=1 i++
j=i j=j+i
k=j k=k+j 循环上限我只开了1w 被hack了 可惜了
//
#include<bits/stdc++.h>
#define ll long long
#define mod 100006
#define IOS ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
inline ll read(){
char c=getchar();
ll f=1,x=0;
while(c<'0'||c>'9'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x*f;
}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}//最大公因数
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/
int main()
{
ll t=read();
while(t--){
ll a,b,c;
ll e,r,t;
a=read();
b=read();
c=read();
ll add=9999999;
for(int i=1;i<=20000;i++){
for(int j=i;j<=20000;j=j+i){
for(int k=j;k<=20000;k=k+j){
ll x,y,z;
x=abs(a-i);
y=abs(b-j);
z=abs(c-k);
add=min(add,x+y+z);
if(add==x+y+z){
e=i;r=j;t=k;
}
}
}
}
printf("%lld\n",add);
printf("%lld %lld %lld\n",e,r,t);
}
return 0;
}
E 构造二叉树 - - 没A掉 赛后补题的
给出 n个节点深度和为 d 问你是否可以构成一个二叉树,可以的话输出全部节点深度。
全部节点组成一条链的话深度和肯定最大,我们就先组成一条链,然后每次移动最下面那个节点,看看移动到哪里合适,然后判断是否可以组成深度和为 d。
F 题意 输入n 代表n个元素 输入x 代表初始位置 v代表初始速度嘛 匀速运动 注意方向 求i j之间距离和的最小值 那么也就两种情况 树状数组维护一下+离散化
一种是永远追不上的 相对最小距离就是初始距离 另一种就是肯定会相遇的 距离最小为0
//https://paste.ubuntu.com/p/n4DT66cQQk/
崩了 见谅 QAQ
继续加油!