题解 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