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

传送门

A. Three swimmers

在这里插入图片描述

#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=2*1e5+5;//�ռ�������� 4e8
 
signed main()
{
//	ios::sync_with_stdio(false);
	int T;
	cin>>T;
	while(T--)
	{
		int p,a,b,c;
		int ans=0;
		scanf("%lld%lld%lld%lld",&p,&a,&b,&c);
		if(p%a==0||p%b==0||p%c==0)
		{
			puts("0");
			continue;
		}
		int aa=p/a+1;
		int bb=p/b+1;
		int cc=p/c+1;
		ans=min(aa*a-p,min(bb*b-p,cc*c-p));
		printf("%lld\n",ans);
	} 
	return 0;
}

B. Card Deck

在这里插入图片描述

#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=2*1e5+5;//�ռ�������� 4e8
struct node
{
	int val,pos;
}e[N];
int n,a[N];
bool cmp(node i,node j)
{
	return i.val>j.val;
}
signed main()
{
//	ios::sync_with_stdio(false);
	int T;
	cin>>T;
	while(T--)
	{
		int ans=0,cnt=0,last=0,ret=1;
		scanf("%lld",&n);
		last=n,cnt=n;
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&a[i]);
			e[i].val=a[i];
			e[i].pos=i;
		}
		
		sort(e+1,e+n+1,cmp);
		
		while(last>=1)
		{
			if(e[ret].pos<=last)
			{
				for(int i=e[ret].pos;i<=last;i++)  printf("%lld ",a[i]);
				last=e[ret].pos-1;
			}
			ret++;
		}
		
		puts("");
	}
	return 0;
}

C. Maximum width

在这里插入图片描述

#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=2*1e5+5;//�ռ�������� 4e8
int n,m;
char s1[N],s2[N];
int a[N],b[N];
int ans;
signed main()
{
//	ios::sync_with_stdio(false);
	cin>>n>>m;
	scanf("%s%s",s1+1,s2+1);
	int l=1,r=n;
	int tl=1,tr=m;
	while(l<=n&&tl<m)
	{
		while(s1[l]!=s2[tl])   l++;
		a[tl]=l;
		tl++,l++;
	}
	while(r>=1&&tr>1)
	{
		while(s1[r]!=s2[tr])  r--;
		b[tr]=r;
		tr--,r--;
	}
	a[m+1]=b[m+1]=1e18;
	for(int i=1;i<m;i++)
	{
		ans=max(b[i+1]-a[i],ans);
	}
	cout<<ans;
	return 0;
}

D. Genius’s Gambit(尚未通过,但有一些思路)

在这里插入图片描述
思路:可以发现s1中1的数量=s2中1的数量+k-进位次数
化简得到k=进位数,构造即可
不知道为什么第11组数据会超时。。。

#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <queue>
#include <deque>
#include <algorithm>
#include <cmath>
#include <vector>
#include <stack>
#include <bitset>
#include <set>
#include <map>
#define inf 0x7fffffff
#define ll long long
//#define int long long
//#define double long double
#define eps 1e-8
//#define mod 1e9+7
using namespace std;
const int mod=1e9+7;
const int M=2e3+5;
const int N=2*1e5+5;//?????????? 4e8
int n,m,k;
string s1,s2,s3;
int cnt;
string add(string str1,string str2)
{
    string str;
    int len1=str1.length();
    int len2=str2.length();
    if(len1<len2)
    {
        for(int i=1;i<=len2-len1;i++)
           str1="0"+str1;
    }
    else
    {
        for(int i=1;i<=len1-len2;i++)
           str2="0"+str2;
    }
    len1=str1.length();
    int cf=0;
    int temp;
    for(int i=len1-1;i>=0;i--)
    {
        temp=str1[i]-'0'+str2[i]-'0'+cf;
        cf=temp/2;
        temp%=2;
        str=char(temp+'0')+str;
    }
    if(cf!=0)  str=char(cf+'0')+str;
    return str;
}
bool check(string s)
{
	int sum1=0,sum2=0;
	int sz=s.size();
	for(int i=0;i<sz;i++)
	{
		if(s[i]=='0')  sum1++;
		if(s[i]=='1')  sum2++;
	}
	if(sum1==n&&sum2==m)  return 1;
	return 0;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int flag=0;
	cin>>n>>m>>k;
	if(k>n+m-1)
	{
		cout<<"No"<<endl;
		return 0;
	}
	s1+="1";
	for(int i=1;i<=n;i++)  s1+="0";
	for(int i=n+1;i<=m+n-1;i++)  s1+="1";
	s2+="0";
	for(int i=1;i<n+m;i++)
	{
		if(s1[i]=='1')
		{
			if(k) 
			{
				s2+="1";
				k--;
			}
			else s2+="0";
		}
		else 
		{
			
			if(k&&i+k>=n+m)
			{
//				cout<<i+k<<" "<<i<<" "<<k<<endl;
				s2+="1";
				k--;
			}
			else  s2+="0";
			
		}
	}
	string s3=add(s1,s2);
//	cout<<s1<<endl;
//	cout<<s2<<endl;
//	cout<<s3<<endl;
	if(check(s3)&&!k)
	{
		cout<<"Yes"<<endl;
		cout<<s3<<endl;
		cout<<s1<<endl;
	}
	else  cout<<"No"<<endl;
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值