Codeforces Round #696 (Div. 2)
A.https://codeforces.com/contest/1474/problem/A
第一位肯定是1,考虑第一位往后需要满足两点
1.该位尽可能大
2.与上一位不同
AC代码:
#include<iostream>
using namespace std;
const int N=1e5+7;
char s[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
scanf("%s",s);
char last='1';
printf("1");
for(int i=1;i<n;i++)
{
if('1'+s[i]!=s[i-1]+last)
{
printf("1");
last='1';
}
else
{
printf("0");
last='0';
}
}
printf("\n");
}
}
B.https://codeforces.com/contest/1474/problem/B
筛出所有质数,先找到大于1+d的一个质数,再找到比这个质数大d的另一个质数,他们的乘积就是答案(他们的乘积必然比第二个数大d)
AC代码:
#include<iostream>
using namespace std;
const int N=1e5+7;
int primes[N],cnt;
bool st[N];
void get_primes(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[cnt++]=i;
for(int j=0; primes[j]<=n/i;j++)
{
st[primes[j]*i]=true;
if (i%primes[j]==0)break;
}
}
}
int main()
{
int t;
scanf("%d",&t);
cnt=0;
get_primes(N);
while(t--)
{
int d;
scanf("%d",&d);
int flag=0,ans=1;
for(int i=0;i<cnt;i++)
{
if(flag==0&&primes[i]>=1+d)
{
flag=1;
ans*=primes[i];
}
if(flag==1&&primes[i]>=ans+d)
{
flag=2;
ans*=primes[i];
}
if(flag==2) break;
}
printf("%d\n",ans);
}
}
c.https://codeforces.com/contest/1474/problem/C
最大的数必然会被删除,而且最大的数必须要是未被删除的两个数的和,所以第一删除最大的一个数和另外一个数应该是最优的,枚举第一次删除的另外一个数,检查它是否是可行的解,由于在检查过程中需要频繁删除一个元素和查找最大值,所以使用multiset。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int a[N];
vector<pair<int,int> > vep; //存步骤
int check(int n,int pos)
{
vep.clear();
vep.push_back(make_pair(a[2*n],a[pos]));
multiset<int> se;
for(int i=1;i<=2*n-1;i++)
{
if(i!=pos)
{
se.insert(a[i]);
}
}
int sum=a[2*n];
int res=true;
//拿了一次 还要拿n-1次
for(int i=1;i<=n-1;i++)
{
int ma=*se.rbegin();
auto it1=se.lower_bound(ma);
se.erase(it1);
auto it=se.lower_bound(sum-ma);
if(it==se.end()||(*it)!=sum-ma)
{
res=false;
break;
}
else
{
vep.push_back(make_pair(ma,sum-ma));
se.erase(it);
sum=ma;
}
}
return res;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=2*n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+2*n);
int ans=0;
for(int i=2*n-1;i>0;i--)
{
if(check(n,i))
{
ans=a[i]+a[2*n];
break;
}
}
if(ans==0) printf("NO\n");
else
{
printf("YES\n");
printf("%d\n",ans);
for(int i=0;i<n;i++)
{
printf("%d %d\n",vep[i].first,vep[i].second);
}
}
}
}