加粗:赛时AC
普通:赛后AC
A. Xu Xiake in Henan Province
水题,有几个零就输出对应的语句。
B. Ultraman vs. Aodzilla and Bodzilla
有人打的时候非要雪花勇闯天涯去做没人出的题,我不说是谁.jpg
模拟+贪心,这题的细节非常多而且繁杂。
首先我们必须明确,结束战斗的回合数是一定的,也就是把hpa+hpb刚好砍完的那一刻,既然回合一定,那么就一定要先解决掉一个怪兽使得收到的伤害最少。
那么我们会发现,先把A杀掉或者先把B杀掉的回合数也是一定的,但是如果把刀集中在一起,由于伤害是递增的,就会造成伤害溢出的情况。所以用可能会将前面溢出的一些伤害打在另一只怪兽身上。
最难的部分体现在要按照字典序输出,我们分类讨论:
一.如果先杀A的伤害更低,我们记录一个杀A溢出伤害x和一个最终溢出伤害y,那么:
1.假如y为正数,就说明目前B还没有死亡,此时x的绝对值一定大于y的绝对值,就需要在前面把A刀转为B刀,基于字典序最小的规定,一定是把刚好等于溢出伤害的地方转为B刀。
2.假如y为负数,就不需要更改。
二、如果先杀B的伤害更低,我们记录一个杀B溢出伤害x和一个最终溢出伤害y,那么:
无论y是否为负数,此时x的绝对值一定大于y的绝对值,就需要在前面把B刀转为A刀,基于字典序最小的规定,注意,由于‘A’<‘B’,所以应该是从第1个到刚好伤害到达小于等于x的绝对值的时候全部转为A刀,但是,这个转换有一个很特殊的情况:
如果y是正数的话,那么B刀转为A刀的时候一定要保证y<=伤害<=x,才能够保证击杀掉A也杀掉B(y是负数的话转A刀就不用考虑必须杀死A,因为A已经死了)。此时,假如我们从小到大一个个从1开始转A刀的话,就有可能在最后一刀的时候刚好伤害>x,而少了这一刀的话就伤害
三、如果两种击杀方式相等,此时我们并不能够保证那种情况的字典序最小,最好的办法就是两种都做一遍然后选择答案更合适的输出
#include
#include
#include<string>
#include
#include
#include
#include
#include
#include
#define N 1000010
#define ll long long
using namespace std;
ll a[N],T;
ll hpa,hpb,atka,atkb;
char ch[N],ch2[N];
//快读
inline void read(ll &p)
{
p=0;
ll f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') p=p*10+(ch-'0'),ch=getchar();
p*=f;
}
int main()
{
read(T);
for(int i=1;i<=N-10;i++) a[i]=a[i-1]+i;
while(T--)
{
read(hpa);read(hpb);
read(atka);read(atkb);
ll shaab=lower_bound(a+1,a+1+N,hpa+hpb)-a;
ll shaa=lower_bound(a+1,a+1+N,hpa)-a;
ll shab=lower_bound(a+1,a+1+N,hpb)-a;
ll shanga=0,shangb=0;
ll limhpa=hpa,limhpb=hpb,limhpb2=limhpb,limhpa2=hpa;
int i;
for(i=1;i<=shaa;i++) shanga+=(atka+atkb),limhpa2-=i;
for(i=shaa+1;i<=shaab;i++) shanga+=atkb,limhpb-=i;
for(i=1;i<=shab;i++) shangb+=(atka+atkb),limhpb2-=i;
for(i=shab+1;i<=shaab;i++) shangb+=atka,limhpa-=i;
for(i=1;i<=shaa;i++) ch[i]='A';
for(i=shaa+1;i<=shaab;i++) ch[i]='B';
//伤害区间(limhpb-abs(limhpa1))
if(limhpb>0) ch[abs(limhpa2)]='B';
for(i=1;i<=shab;i++) ch2[i]='B';
for(i=shab+1;i<=shaab;i++) ch2[i]='A';
ll limms=0;
for(i=1;i<=shab;i++)
{
if(limms>=limhpa) break;
limms+=i;
ch2[i]='A';
}
if(limms>abs(limhpb2))
{
ch2[i-1]='B';
ch2[i-2]='B';
i--;
limms-=i;
i--;
limms-=i;
for(i;i<=shab;i++)
{
if(limms+i>limhpa) break;
}
ch2[i-1]='A';
}
else
{
for(i;i<=shab;i++)
{
if(limms>abs(limhpb2)) break;
ch2[i]='A';
limms+=i;
}
ch2[i-1]='B';
}
if(shanga<shangb)
{
printf("%lld ",shanga);
for(int i=1;i<=shaab;i++) printf("%c",ch[i]);
}
else if(shanga>shangb)
{
printf("%lld ",shangb);
for(int i=1;i<=shaab;i++) printf("%c",ch2[i]);
}
else
{
printf("%lld ",shanga);
bool f=1;
for(int i=1;i<=shaab;i++)
{
if(ch[i]0;break;}
else if(ch[i]>ch2[i]){f=1;break;}
}
if(f) for(int i=1;i<=shaab;i++) printf("%c",ch2[i]);
else for(int i=1;i<=shaab;i++) printf("%c",ch[i]);
}
printf("\n");
}
return 0;
}
/*
1
5 5 1 1
5
5 15 5 25
5 15 25 5
251765086 586338075 348202 6436188
23 76 3 33
*/
D. Keiichi Tsuchiya the Drift King
数学题,杰哥做的,我看不懂,弃疗.jpg
#define _CRT_SECURE_NO_WARNINGS
#include
#include <string>
#include
#include
#include
E. Resistors in Parallel
这题有点让人无语,我是打了个表发现规律的,至于为什么我不是很清楚,后续会补上的。
总的来说就是以质数的积为界限,以质数+1的积为答案,但是由于数字有点大,所以需要高精度,或者用别的语言,我是用py写得。
学习一门外语真是非常重要啊.jpg
F. Honeycomb
模拟题,是壕哥写得,写得时候注意字符该怎么处理,注意cin和getline的速度很慢,所以T了很多发,gets的速度会快很多。
#include
#include
#include
#include
I. Distance
思维题,首先确定策略,策略是每两次都加入最外围没有加入答案的两棵树木,在这两次之间的答案增量是一样的,而在第二次时会改变增量。