题解 P5646 【ygg的题库】
emmm...
事实证明考试时不会可以借助SPJ和随机序列乱搞
在时限范围内随机一个序列,判断是否符合题意,然后输出即可~
详见代码qwq
#include<bits/stdc++.h>
using namespace std;//头文件
#define MAX_TIME 0.8//时限,超过0.8s比较危险,就不随机了qwq
int n,m;
double a[4005],ans[35];//你懂得
bool b[4005];
void Produce()//随机产生一个序列
{
for(register int i=1;i<=n;i++)
{
ans[i]=(rand()%20000-10000)/100;//序列范围[-100.0,100.0]
}
}
bool check()//判断序列合法
{
int wrongnum=0;//因为说了错误组数小于等于5组就可以得全分,所以偷个懒qwq
double sum;
for(register int i=1;i<=m;i++)
{
sum=0;
for(register int j=1;j<=n;j++)//对于每一个条件进行求和
{
sum+=pow(a[i],j-1)*ans[j];//因为是double型的,就偷懒用个cmath的pow
}
if(sum>0&&!b[i])wrongnum++;//不满足wrongnum++
else if(sum<=0&&b[i])wrongnum++;//不满足wrongnum++
if(wrongnum>5)return 0;//错误组数大于5组则序列不合法
}
return 1;//序列合法
}
int main()
{
srand(time(0));
scanf("%d%d",&n,&m);
for(register int i=1;i<=m;i++)
{
scanf("%lf%d",&a[i],&b[i]);//读入
}
do
{
Produce();//产生序列
}while(!check()&&(double)clock()/CLOCKS_PER_SEC<MAX_TIME);//序列合法或超出时限就退出
for(register int i=1;i<=n;i++)
{
printf("%.5lf ",ans[i]);//输出
}
return 0;//结束了罪恶的一生qwq
}
资瓷一下叭qwq