Codeforces Round #379 (Div. 2) 解题报告

时间:2020-12-16 22:43:41

题目地址

本次CF是在今天早上深夜进行,上午有课就没有直接参加。今天早上上课坐到后排参加了virtual participation。这次CF前面的题目都非常的水,不到10分钟就轻松过了前两题,比较郁闷的是之后一直卡在C,开始是脑残的没有用二分TLE,后来又是因为一个常数打错而一直WA……于是模拟赛就只过了2道题(太弱了orz)。时间到了后很快发现了脑残错误,终于A了C题。下午上完课回到宿舍看D题才发现D题水的不行,很快就A了。不过E和F就比较超出我现在知识范围了,暂时就先放下。第一次参加virtual participation,感觉这个模式真的是很赞,以后有时间一定要多多的参加训练自己。道阻且长,加油吧!

A题

这……就数一下A和D的个数,判断一下输出就可以了。没什么可说的。

 #include <iostream>
#include <cstdio>
using namespace std;
char a[];
int n,m=,k=,i;
int main()
{
scanf("%d",&n);
scanf("%s",a);
for(i=;i<n;i++)
{
if(a[i]=='A')
m++;
else
k++;
}
if(m==k)
printf("Friendship\n");
else if(m>k)
printf("Anton\n");
else
printf("Danik\n");
return ;
}

B题

先尽可能组256,2、5、6个数的最小值即为可组成的256个数。2减去256个数后再取2、3个数最小值即为32个数最大值。这样相加即得到了最多的个数。

 #include <iostream>
#include <cstdio>
using namespace std;
unsigned long long int a2,a3,a5,a6,he,de;
unsigned long long min3(unsigned long long int x,unsigned long long int y,unsigned long long int z)
{
if(x<y)
return min(x,z);
else
return min(y,z);
}
int main()
{
cin>>a2>>a3>>a5>>a6;
de=min3(a2,a5,a6);
a2-=de;a5-=de;
a6-=de;
he+=de*;
he+=min(a2,a3)*;
cout<<he;
}

C题

(TLE、WA了很久,捂脸つ﹏⊂……)对于第一种魔法就是for循环,逐个判断,其中循环的内部二分查找此时第二种魔法可行中最好的一个。找到对于每一个第一种魔法的第二种魔法最优选法。注意还要看只选第二种魔法的情况。全都比较一下就找到了耗时最短的办法。

 #include <iostream>
#include <cstdio>
using namespace std;
unsigned long long int n,m,k,a[],b[],c[],d[],x,s,i,j,l,r,mid,an;
int main()
{
cin>>n>>m>>k;
cin>>x>>s;
for(i=;i<=m;i++)
cin>>a[i];
for(i=;i<=m;i++)
cin>>b[i];
for(i=;i<=k;i++)
cin>>c[i];
for(i=;i<=k;i++)
cin>>d[i];
b[]=c[]=d[]=;
a[]=x;
an=x*n;
for(i=;i<=m;i++)
{
if(a[i]>x||b[i]>s)
continue;
l=;r=k;
j=;
while(l<=r)
{
mid=(l+r)>>;
if(d[mid]+b[i]>s)
r=mid-;
else
{
l=mid+;
j=max(mid,j);
}
}
an=min(an,(n-c[j])*a[i]);
}
cout<<an;
return ;
}

D题

用a数组记录8个方向是否可行,b数组记录此时各个方向离目标点最近的点的距离。全都进行过判断后,再遍历一遍a数组看是否有方向满足即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
long long int a[],b[],si,sj,ti,tj,n,st,kind,di;
int dir[][]={{,,,,,,,},{,,,,,,,},{,,,,,,,}},i;
char c[];
int val(long int x,long long int y)
{
long long int d1,d2;
d1=x-si;
d2=y-sj;
if(d2==&&d1<)
return ;
else if(d1+d2==&&d2>)
return ;
else if(d1==&&d2>)
return ;
else if(d1>&&d1==d2)
return ;
else if(d1>&&d2==)
return ;
else if(d1>&&d1+d2==)
return ;
else if(d1==&&d2<)
return ;
else if(d1<&&d2==d1)
return ;
else return -;
}
int main()
{
memset(b,-,sizeof(b));
memset(a,,sizeof(a));
scanf("%I64d",&n);
scanf("%I64d%I64d",&si,&sj);
while(n--)
{
scanf("%s%I64d%I64d",c,&ti,&tj);
if(c[]=='Q')
kind=;
else if(c[]=='B')
kind=;
else kind=;
st=val(ti,tj);
if(st>-)
{
di=max(abs(ti-si),abs(tj-sj));
if(!dir[kind][st])
{
if(di<b[st]||b[st]<)
{b[st]=di;
a[st]=;
}
continue;
}
else{
if(di<b[st]||b[st]==-)
{
a[st]=;
b[st]=di;
}
}
}
else
{
continue;
}
}
for(i=;i<;i++)
{
if(a[i]==)
break;
}
if(i<)
printf("YES\n");
else printf("NO\n");
}