好吧,我又来不务正业了,UESTC-28题链接:
http://acm.uestc.edu.cn/#/problem/show/28
这道题没涉及什么算法,自己写了个暴力破解的版本如下,但是运行时间太长了,百思不得其优化算法,于是到网上搜索合适的代码。。
#include
#include
typedef struct node
{
int A;
int T;
}node;
void func(node* cai,int n,int myA,int bossH);
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<=1)break;//输入竞争补刀的玩家个数
node * cai=(node *)malloc(sizeof(node)*(n-1));//创建竞争补刀的敌方单位 cai,都是些菜,想跟我补刀?
int ii=0;
int myA,bossH;
while(ii=H_kill && flag)//达到斩杀线,且之后不再计算
{
T_start=t;
flag=0;
}
if(sumA>=bossH)
{
T_end=t;
break;
}
++t;
}
while(T_start<=T_end)
{
int flagg=1;
for(int i=0;imyA)
{
T_end--;
flagg=0;
break;
}
}
}
if(flagg)break;
}
while(T_start<=T_end)
{
int flagg=1;
for(int i=0;imyA)
{
T_start++;
flagg=0;
break;
}
}
}
if(flagg)break;
}
if(T_start>T_end)
{
printf("Impossible\n");
return;
}
else
{
printf("%d %d\n",T_start,T_end);
return ;
}
}
#include
int k;
struct stu
{
int x;// 时间间隔为T的时候DPS之和,输出的最大伤害
int mx;//时间间隔为T的时候最大的DPS
}bu[110];//bu[T],按时间点T创建的结构体数组
int f(int j)
{
int i,m=0,mxx=0;
for(i=1;i<=100;i++)
if(bu[i].mx)
m=m+(j/i)*bu[i].x;
return m;
}
int main()
{
int i,j,x,t,m,n,P,H,l,mxx;//
double s,x1,t1,n1,y1;//s代表所有彩笔的单位时间DPS之和 ,n1是斩杀线/单位时间只和
while(scanf("%d",&n)&&n)
{
for(i=0;i<=100;i++)
bu[i].mx=bu[i].x=0;//bu[]赋初值
s=0;
for(i=1;ibu[t].mx)bu[t].mx=x;//时间t时刻,当前的最大输出记录为bu[t].mx
x1=x;
t1=t;
s=s+x1/t1;//s是所有彩笔的单位时间DPS之和,用来计算靠近斩杀线的时间
}
scanf("%d%d",&P,&H);
x1=H;
y1=P;
n1=(x1-y1)/s;//n1是靠近斩杀线的时间 下一步赋值为n
n=n1;
if(n==0)n=1;
l=0;
for (i=n;i<=100+n;i++)//从靠近斩杀线的时间n开始枚举
{ m=0;mxx=0;
for(j=1;j<=100;j++)//时间t的枚举,从1到100;
{
if(bu[j].mx)
{
m=m+(i/j)*bu[j].x;//m是输出伤害j时间下,输出次数*输出伤害=总输出数
if(i%j==0&&bu[j].mx>mxx)
mxx=bu[j].mx;//所有时刻的最高输出???不明白 buj.x改为mx
}
}
if(m+P>=H&&mxx<=P){l=i;break;}//P是我的输出,m是总伤害
else if(m+P>=H)
break;
}
if(l==0)
{
printf("Impossible\n");
continue;
}
printf("%d",l);
n1=x1/s;
n=n1;
for(j=n+100;j>=l;j--)
{
m=0; mxx=0;
for(i=1;i<=100;i++)
{
if(bu[i].mx)
{
m=m+(j/i)*bu[i].x;
if(j%i==0&&bu[i].mx>mxx)
mxx=bu[i].mx;
}
}
if(m+P>=H&&mxx<=P&&f(j-1)