• 牛客练习赛-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;
    }
    

      

  • 相关阅读:
    Project 01 PlantAndZomb
    iOS平台内存使用原则
    IOS之UIKit_Day22--23
    IOS之UIKit_Day21
    IOS之UIKit_Day20
    浅谈javascript数据类型,对象,类
    从输入一个url到加载页面发生了什么?
    d3.js(2)-svg
    d3.js(1)
    console.time和performance.now()
  • 原文地址:https://www.cnblogs.com/SDUTNING/p/10234132.html
Copyright © 2020-2023  润新知