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

来源:互联网 发布:2016淘宝c店销售前十名 编辑:程序博客网 时间:2024/04/30 04:02

一开始就明白那个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\n",ans);      }  }  return 0;}


 

 

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

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

#include<iostream>#include<cstdio>#include<cstring>#include<map>#include<set>#define inf 999999999using 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\n",a[i][0],a[i][1]);          double temp=a[i][0]-a[i][1];          ans=max(ans,temp);        }        printf("%.2lf\n",ans);    }    return 0;}


 

原创粉丝点击