牛客练习赛-36

RANK :86   题数 :1

做了三题过了一个...A题最小表示法裸题, B题dp状态定错一直改一直WA,F题叉积 计算凸多边形面积。 预处理姿势错误。

补题 :

记录叉积公式的前缀和即可。

#include<bits/stdc++.h>
using namespace std;
#define maxn 123456
struct node
{
    double x,y;
} a[maxn];
double sum1[maxn],sum2[maxn],sum,ans,tp;
int n,q,c,d;
int main()
{
    scanf("%d%d",&n,&q);
    for(int i=1; i<=n; i++)
        scanf("%lf%lf",&a[i].x,&a[i].y);
    a[n+1]=a[1];
    for(int i=1; i<=n; i++)
    {
        sum1[i+1]=sum1[i]+a[i].x*a[i+1].y;
        sum2[i+1]=sum2[i]+a[i].y*a[i+1].x;
    }
    sum=(sum1[n+1]-sum2[n+1])/2;
    while(q--)
    {
        scanf("%d%d",&c,&d);
        if(c>d)swap(c,d);
        tp=a[d].x*a[c].y-a[c].x*a[d].y;
        tp+=((sum1[d]-sum1[c])-(sum2[d]-sum2[c]));
        tp/=2;
        ans=max(ans,min(sum-tp,tp));
    }
    printf("%.15lf
",ans);
    return 0;
}

  

C题 :https://ac.nowcoder.com/acm/contest/328/C

思路:转化一下,看似是一个体积为 W的完全背包但还有个额外要求,恰好完成K门课,所以预处理 假设K门课都通过一天完成。

然后剩下的天数进行完全背包求最大价值 ,这样的话原来天数的价值需要与 1天完成做差预处理。然后就可以放心的完全背包了。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 12345
int dp[maxn],n,k,w,a[maxn];
int main()
{
    scanf("%d%d%d",&n,&k,&w);
    for(int i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
        if(i)a[i]-=a[0];
    }
    dp[0]=k*a[0];
    w-=k;
    for(int i=1; i<n; i++)
        for(int j=i; j<=w; j++)
            dp[j]=max(dp[j],dp[j-i]+a[i]);
    printf("%d
",dp[w]);
    return 0;
}

  

  • Rabbit的数列
  • 思路:分块整体标记块内数字,如果块内出现混色需要修改为 -1,此时记得把染得色下放
  • #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define maxn 1234567
    int n,q,c,x,y,a,b,big,tong[maxn];
    int data[maxn],bo[maxn],ans;
    ll tp,L,R;
    void cal(int l,int r)
    {
        int j;
        tong[y]+=(r-l+1);
        for( j=l; j<=r&&j%big; j++)
        {
            if(bo[j/big]!=y&&bo[j/big]!=-1)
            {
                for(int sk=(j/big)*big; sk<(j/big+1)*big; sk++)
                    data[sk]=bo[j/big];
                bo[j/big]=-1;
            }
            tong[data[j]]--;
            data[j]=y;
        }
        for(; j+big-1<=r; j+=big)
        {
            if(bo[j/big]!=-1)
                tong[bo[j/big]]-=big;
            else
            {
                for(int sk=j; sk<=r&&sk<j+big; sk++)
                {
                    tong[data[sk]]--;
                    data[sk]=y;
                }
            }
            bo[j/big]=y;
        }
        for(; j<=r; j++)
        {
            if(bo[j/big]!=y&&bo[j/big]!=-1)
            {
                for(int sk=(j/big)*big; sk<(j/big+1)*big; sk++)
                    data[sk]=bo[j/big];
                bo[j/big]=-1;
            }
            tong[data[j]]--;
            data[j]=y;
        }
    }
    int main()
    {
        scanf("%d%d%d",&n,&c,&q);
        big=sqrt(n);
        for(int i=0; i<=n; i++)
            data[i]=bo[i]=1;
        tong[1]=n;
        while(q--)
        {
            scanf("%d%d%d%d",&x,&y,&a,&b);
            tp=tong[x];
            L=((tp+b)%n*(tp+b)%n+a)%n;
            R=((tp*b)%n*(tp*b)%n+a)%n;
            tp=L;
            L=min(L,R);
            R=max(R,tp);
            cal(L,R);
        }
        for(int i=0; i<maxn; i++)
            ans=max(ans,tong[i]);
        printf("%d
    ",ans);
        return 0;
    }
    

      Rabbit的工作(1)

#include<bits/stdc++.h>
using namespace std;
#define maxn 456
int n,m,dp[3][maxn][maxn],cur,ans,up,sum[maxn];
char str[maxn];
int main()
{
    memset(dp,-1,sizeof(dp));
    scanf("%d%d%s",&n,&m,str+1);
    dp[0][0][0]=m;
    for(int i=1; i<=n; i++)if(str[i]=='1')sum[i]=sum[i-1]+1;
        else sum[i]=sum[i-1];
    for(int i=1; i<=n; i++)
    {
        up=sum[i];
        memset(dp[cur^1],-1,sizeof(dp[cur^1]));
        if(str[i]=='1')
        {
            for(int j=1; j<=up; j++)
                for(int k=1; k<=min(up,m); k++)
                {
                    dp[cur^1][j][k]=max(dp[cur^1][j][k],dp[cur][j-1][k-1]-k);
                }
        }
        for(int j=0; j<=up; j++)
            for(int k=0; k<=min(up,m); k++)
            {
                dp[cur^1][j][0]=max(dp[cur^1][j][0],dp[cur][j][k]);
            }
        cur^=1;
    }
    up=sum[n];
    for(int i=up; i>=0; i--)
        for(int k=0; k<=min(up,m); k++)
            if(dp[cur][i][k]>=0)
            {
                printf("%d
",i);
                return 0;
            }
    return 0;
}

  

原文地址:https://www.cnblogs.com/SDUTNING/p/10234132.html