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;
}