Codeforces Round #742 (Div. 2) A-D

A.Domino Disaster

看样例就知道:就是让你U变D,D变U,其他的不变

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
   	int t;
   	cin>>t;
while(t--)
{
   	int n;
   	cin>>n;
   	string s;
   	cin>>s;
   	for(int i=0;i<=n-1;i++)
   	{
   	   if(s[i]=='D')
   	   	cout<<"U";
   	   else if(s[i]=='U')	
   	   cout<<"D";
   	   else
   	   cout<<s[i];
	}
	cout<<endl;
}
} 

B.MEXor Mixup

大致意思就是给定两个数a,b分别表示某一列数的MEX和XOR
MEX就表示这一列数未出现过的最小自然数
XOR表示这一列数中所有数的异或值
让你求出这一列数的最小长度

思路:

首先预处理所有连续数的异或值(到3e5)
如果位数-1等于给定的异或值,则输出a(因为包括0)
如果位数-1再异或b等于给定的异或值,则输出a+2
其余的输出a+1即可(包括0,1,2,…MEX-1和XOR一共a+1个数)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int a[300007];
    a[0]=0;
    for(ll i=1; i<=300001; i++)
        a[i]=(a[i-1]^i);
        int t;
    cin>>t;
    while(t--)
    {
    	int c,b;
        cin>>c>>b;
        ll ans=0;
        if((a[c-1]^b)==c)
            ans=c+2;
        else if(a[c-1]==b)
            ans=c;
        else ans=c+1;
        cout<<ans<<endl;
    }
}

C. Carrying Conundrum

给定一个运算形式:进位的时候不是向上一位进位,而是进两位,就是说将所有的进位往左移一位,给定一个按此方法进位得到的计算答案,问原本可能有多少种数字组合?(a,b)(b,a)算两种

思路:

奇偶不会互相影响,分别算出来然后结合样例就推出来了hhhh
抄了官方题解的一段补充:
n=12345 ;
12345→135,24.
45+90=135 and 9+15=24,
495+1950 =12345

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        ll a=0,b=0,tmp=0,ans1=1,ans2=1;
        for(int i=1;; i++)
        {
            tmp=n%10;
            if(i%2==1)
                a+=tmp*ans1,ans1*=10;
            else
                b+=tmp*ans2,ans2*=10;
            n=n/10;
            if(n<=0)
            break;
        }
        cout<<(a+1)*(b+1)-2<<endl;
    }
}

D. Expression Evaluation Error

给定a,b两个数,要求把a分成b组(每一组都必须大于等于1),让b组数之和等于a,求一种分法,使得所有的数转换为十一进制后按照11进制的规则进行计算,之后再将其转换为十进制得到的数最大。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[108]= {0},a[100009];
ll sum=0;
void chai(ll x)
{
	int cnt=0;
	    while(x)
        {
            a[++cnt]=x%10;
            sum+=a[cnt];
            x/=10;
        }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        num[1]=1;
        for(int i=2; i<=10; i++)
            num[i]=num[i-1]*10;
        ll n,k,temp;
        cin>>n>>k;
        temp=n;
        sum=0;
        ll ans=0,anss=0;
        chai(temp);
        while(sum<k)
        {
            for(int i=2; i<=10; i++)
            {
                if(a[i])
                {
                    a[i]--;
                    a[i-1]+=10;
                    sum+=9;
                    break;
                }
            }
        }
        for(int i=1; i<=10; i++)
        {
            for(int j=1; j<=a[i]; j++)
            {
                if(anss==k-1)
                goto aa;
                cout<<num[i]<<" ";
                ans+=num[i];
                anss++;
            }
        }
        aa:;
        cout<<n-ans<<endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值