Codeforces Round 1004 (Div. 2) A~D

这场最后写出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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值