• HDU4666+POJ2926【最远曼哈顿距离】


    一开始就明白那个N*1《k的算法了,

    可无奈删除操作耗时还是太多,最后学习了STL set,map相应的用法,方便好多。

    STL真的是一个好工具羡慕

    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<set>
    #include<vector>
    #include<cstring>
    using namespace std;
    multiset<int> a[60005];
    int x[60005][6];
    int main()
    {
      int n,k,op,num;
      while(scanf("%d%d",&n,&k)!=EOF)
      {
          for(int i=0;i<1<<k;i++)
            a[i].clear();
          for(int i=1;i<=n;i++)
          {
              scanf("%d",&op);
              if(op==0)
              {
                  for(int j=0;j<k;j++)
                    scanf("%d",&x[i][j]);
                  for(int j=0;j<1<<k;j++)
                  {
                     int s=0;
                     for(int q=0;q<k;q++)
                     {
                         if(j&1<<q) s+=x[i][q];
                         else s-=x[i][q];
                     }
                     a[j].insert(s);
                  }
              }
              else
              {
                  scanf("%d",&num);
                  for(int j=0;j<1<<k;j++)
                  {
                      int s=0;
                      for(int q=0;q<k;q++)
                      {
                          if(j&1<<q) s+=x[num][q];
                          else s-=x[num][q];
                      }
                      multiset<int>::iterator sum=a[j].find(s);
                      a[j].erase(sum);
                  }
              }
              int ans=-100000000;
              for(int j=0;j<1<<k;j++)
              {
                  multiset<int>::iterator t=a[j].end();
                  t--;
                  int t1=(*t);
                  t=a[j].begin();
                  int t2=(*t);
                  ans=max(ans,t1-t2);
              }
              printf("%d
    ",ans);
          }
      }
      return 0;
    }


     

    接下来是POJ2926这道题用上面的方法奇葩的是G++WA,C++TLE,,无语中。。。

    把multiset去了稍微改一下就过了,,囧,,,,

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<set>
    #define inf 999999999
    using namespace std;
    double x[100005][6];
    double  a[1<<5+1][2];
    int main()
    {
        int n;
        scanf("%d",&n);
        {
            for(int i=0;i<1<<5;i++)
                {
                    a[i][0]=-inf;
                    a[i][1]=inf;
                }
            for(int qq=1;qq<=n;qq++)
            {
                for(int j=0;j<5;j++)
                  scanf("%lf",&x[qq][j]);
                for(int i=0;i<(1<<5);i++)
                {
                    double sum=0;
                    for(int j=0;j<5;j++)
                    {
                        if(i&(1<<j)) sum+=x[qq][j];
                        else sum-=x[qq][j];
                    }
                    if(sum>=a[i][0])
                        a[i][0]=sum;
                    if(sum<=a[i][1])
                        a[i][1]=sum;//是所有数的相减。。
                }
            }
            double ans=-inf;
            for(int i=0;i<(1<<5);i++)
            {
             // printf("%.2lf %.2lf
    ",a[i][0],a[i][1]);
              double temp=a[i][0]-a[i][1];
              ans=max(ans,temp);
            }
            printf("%.2lf
    ",ans);
        }
        return 0;
    }
    


     

  • 相关阅读:
    协议
    创建属性、属性标签、对象序列化
    JS中generater和箭头函数
    前端forEach在Array、map、set中的使用,weakset,weakmap
    更新最大内码,金蝶开发
    ERP,还需要WEB开发吗
    可读性太低的SQL语句
    事务,视图和索引
    简单子查询
    创建表并添加约束
  • 原文地址:https://www.cnblogs.com/james1207/p/3257949.html
Copyright © 2020-2023  润新知