这场最后写出D的时候太爽了家人们 不过还是被OGod薄纱 本期封面还是我的AI图
A - Adjacent Digit Sums
题意
给两个数,问存不存在两个相邻的数各位数字之和刚好是他们
思路
首先没有进位的话那就是要这两个数相差1嘛,然后我们再考虑从第一个数到第二个数有进位的情况
假设最后n位都是9,那我加1的话就是第n+1位数值加1了,剩下的9全部变成0了,也就是减去一个9的倍数,所以这两个数的差值模9始终等于1才可以满足题意
代码
//
// Created by Swan416 on 2025-02-11 22:26.
//
#include <bits/stdc++.h>
#define maxOf(a) *max_element(a.begin(),a.end())
#define minOf(a) *min_element(a.begin(),a.end())
#define all(a) a.begin(),a.end()
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void solve()
{
ll x,y;
scanf("%lld%lld",&x,&y);
x++;
if((x-y)%9==0 and x>=y)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
int main()
{
int T=1;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
B - Two Large Bags
题意
给你两个包,第一个包塞了很多数字,然后每次操作可以选一个数字丢到第二个包或者是第二个包和第一个包都有的一个数字把第一个包里的他加1,问有没有机会两个包完全相同
思路
贪心,如果一个数字n出现两次那就两边平均分配,再有的话就把多于2次的全部在第一个包里变成n+1
代码
//
// Created by Swan416 on 2025-02-11 22:40.
//
#include <bits/stdc++.h>
#define maxOf(a) *max_element(a.begin(),a.end())
#define minOf(a) *min_element(a.begin(),a.end())
#define all(a) a.begin(),a.end()
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void solve()
{
int n;
scanf("%d",&n);
vector<int> a(n+1,0);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[x]++;
}
for(int i=1;i<=n;i++)
{
if(a[i]==1)
{
printf("No\n");
return ;
}
if(a[i]>=2)
{
a[i+1]+=a[i]-2;
a[i]=2;
}
}
printf("Yes\n");
}
int main()
{
int T=1;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
C - Devyatkino
题意
给你一个正整数加上最少次数的9/99/999…使得这个数字里面有7
思路
很诡异的一个guess,首先暴力加9计算最大次数,这个数字不会大于110,一定会出现一个有7的,然后我们尝试用999之类的去折叠,如果这个次数大于11那就折叠成多次99,算出一个答案之后再check一下全部加相同数字的情况
代码
//
// Created by Swan416 on 2025-02-11 23:07.
//
#include <bits/stdc++.h>
#define maxOf(a) *max_element(a.begin(),a.end())
#define minOf(a) *min_element(a.begin(),a.end())
#define all(a) a.begin(),a.end()
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
bool have7(ll x)
{
while(x>0)
{
if(x%10==7)
{
return true;
}
x/=10;
}
return false;
}
int max9;
void solve()
{
ll n;
scanf("%lld",&n);
if(have7(n))
{
printf("0\n");
return;
}
max9=0;
ll tmp=n;
while(!have7(tmp))
{
max9++;
tmp+=9;
}
// printf("%d\n",max9);
int ans=0;
ll now=111111111;
while(max9)
{
ans+=max9/now;
max9%=now;
now/=10;
}
for(int i=1;i<ans;i++)
{
ll cur=9;
while(cur<=9999999999)
{
if(have7(n+cur*i))
{
// printf("%d %d\n",i,cur);
printf("%d\n",i);
return;
}
cur=cur*10ll+9ll;
}
}
printf("%d\n",ans);
}
int main()
{
int T=1;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
D - Object Identification
题意
给你一个数组a,藏起来一个数组b,可能代表是一个有向图或者一个二维平面图,两次询问得知哪一种
思路
首先我们分为两种情况,第一种是1到n在a中没有全部出现过的,这里假设x没有出现过,也就意味着x不连接任何一个点(如果是类型a的话),那么询问x和任意一个点一定是0,不然就是类型b(因为曼哈顿距离一定大于0)
然后是1到n都出现过的,我们询问a中值是1和n的下标,因为如果是类型a的话两个点的距离最长也就n-1,但是如果是类型b的话按照曼哈顿距离的定义,得到的曼哈顿距离一定大于等于n-1,如果得到的结果刚好是n-1的话我们再反过来问一下看两次答案是不是一样即可
代码
//
// Created by Swan416 on 2025-02-11 23:50.
//
#include <bits/stdc++.h>
#define maxOf(a) *max_element(a.begin(),a.end())
#define minOf(a) *min_element(a.begin(),a.end())
#define all(a) a.begin(),a.end()
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void solve()
{
int n;
scanf("%d",&n);
vector<int> a(n+1,0);
vector<int> sve;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[x]++;
sve.push_back(x);
}
for(int i=1;i<=n;i++)
{
if(a[i]==0)
{
int x,y;
printf("? %d %d\n",i,sve[0]);
flush(cout);
scanf("%d",&x);
printf("? %d %d\n",sve[0],i);
flush(cout);
scanf("%d",&y);
if(x==0 or y==0 or x!=y)
{
printf("! A\n");
flush(cout);
return;
}
else
{
printf("! B\n");
flush(cout);
return;
}
}
}
int minp=0,maxp=0;
for(int i=1;i<n;i++)
{
if(sve[i]<sve[minp]) minp=i+1;
if(sve[i]>sve[maxp]) maxp=i+1;
}
int x,y;
printf("? %d %d\n",minp+1,maxp+1);
flush(cout);
scanf("%d",&x);
printf("? %d %d\n",maxp+1,minp+1);
flush(cout);
scanf("%d",&y);
if(x<n-1 or y<n-1 or x!=y)
{
printf("! A\n");
flush(cout);
return;
}
else
{
printf("! B\n");
flush(cout);
return;
}
}
int main()
{
int T=1;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}