zoukankan      html  css  js  c++  java
  • HDU 1421

    搬寝室

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 9687    Accepted Submission(s): 3257


    Problem Description
    搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2*k件过去就行了.但还是会很累,因为2*k也不小是一个不大于n的整数.幸运的是xhd根据多年的搬东西的经验发现每搬一次的疲劳度是和左右手的物品的重量差的平方成正比(这里补充一句,xhd每次搬两件东西,左手一件右手一件).例如xhd左手拿重量为3的物品,右手拿重量为6的物品,则他搬完这次的疲劳度为(6-3)^2 = 9.现在可怜的xhd希望知道搬完这2*k件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧.
     
    Input
    每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).
     
    Output
    对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.
     
    Sample Input
    2 1 1 3
     
    Sample Output
    4
    View Code
     1 //d[k][i][j] = min(k-1) + w[i][j];
     2 #include <iostream>
     3 #include <cstring>
     4 #include <vector>
     5 using namespace std;
     6 const int N = 2000;
     7 bool vis[N][N];
     8 int f[N];
     9 int d[100][100][100];
    10 int fun(int a)//求平方 
    11 {
    12     return a*a;
    13 }
    14 int main()
    15 {
    16     int i,j,t,T;
    17     int n,k;
    18     while(cin>>n>>k)
    19     {
    20         //vector < vector<bool > > vis(n,vector<bool > n);
    21         memset(vis,false,sizeof(vis));
    22         memset(f,0,sizeof(f));
    23         memset(d,-1,sizeof(d));//不可为0,若两件物品重量相同,那就冲突啦 
    24         int min = 0x7fffffff;
    25         for(i=0;i<n;i++)
    26             cin>>f[i];
    27         for(i=0;i<n;i++)
    28             for(j=0;j<n;j++)
    29             if(i!=j)
    30             {
    31                 int index = f[i] - f[j];
    32                 d[0][i][j] = fun(index);
    33                 //cout<<d[0][i][j]<<endl;
    34                 if(d[0][i][j]<min)
    35                 {
    36                     vis[i][j] = true;
    37                     min = d[0][i][j];
    38                 }
    39             }
    40         for(t=1;t<=k;t++)
    41         for(i=0;i<n;i++)
    42             for(j=0;j<n;j++)
    43             if(!vis[i][j]&&d[t][i][j]!=-1)
    44             {
    45                 int temp = f[i] - f[j];
    46                 d[t][i][j] = min + fun(temp);
    47                 if(d[t][i][j]<min)
    48                 {
    49                     min = d[t][i][j];
    50                     vis[i][j] = true;
    51                 }
    52             }
    53         cout<<min<<endl;
    54     }
    55     return 0;
    56 }
    57                      
    58 //且不说,三维数组d[1000][2000][2000]无法实现,这个思想就不对,感觉特别像贪心            
    59                 
    60                 
    61         
     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdlib>
     4 using namespace std;
     5 int d[2010][1005];
     6 int f[2002];
     7 int fun(int a)//求平方 
     8 {
     9     return a*a;
    10 }
    11 int min(int a,int b)
    12 {
    13     return a>b?b:a;
    14 }
    15 int cmp(const void *a,const void *b)
    16 {
    17     return *(int *)a - *(int *)b;
    18 }
    19 void dp(int n,int k)//n件物品曲k次 
    20 {
    21     int i,j,t;
    22     for(i=1;i<=n;i++)
    23         d[i][0] = 0;
    24     for(i=1;i<=n;i++)
    25     {
    26         for(j=1;j<=i/2;j++)
    27         {
    28             int index = f[i]-f[i-1];//不是j 
    29             if(i>2*j)//因为要对第i件物品选择状态,必须多出一件 
    30             {
    31                 d[i][j] = min(d[i-1][j],d[i-2][j-1] + fun(index));//第i件物品要或者不要 
    32             }
    33             else
    34                 d[i][j] = d[i-2][j-1] + fun(index);
    35         }
    36     }
    37     cout<<d[n][k]<<endl;
    38 }
    39 int main()
    40 {
    41     int i,j,t,T;
    42     int n,k;
    43     while(cin>>n>>k)
    44     {
    45         memset(d,0,sizeof(d));
    46         memset(f,0,sizeof(f));
    47         for(i=1;i<=n;i++)
    48             cin>>f[i];
    49         qsort(f+1,n,sizeof(int),cmp);
    50         dp(n,k);
    51     }
    52     return 0;
    53 }
    54      
    55                 
    56         
  • 相关阅读:
    轻量级调试api接口 Jquery.PlayingAPI v 1.0
    js验证整数加保留小数点
    简单漂亮bootstrap grid列表分页 demo.
    polemo-logger 分析
    POSIX 标准的获取(pdf 格式)
    游戏开发利器(工具、资源)
    仅有 265 行的第一人称引擎
    介绍一款非常适合做微网站并且免费的CMS系统
    兔子无限繁殖问题——婓波那契数列
    近似计算
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2648740.html
Copyright © 2011-2022 走看看