A O(NM) dynamic programming algorithm is quite apparent after sorting the computers and network interfaces by their coordinates. Furthermore, in any optimized case, for each computer the difference between the the indices of the network interfaces matching to and closest to the computer is never larger than N. So the complexity could be reduced to O(N2)


有很多细节不好考虑,应该是我的水平原因。最后我向updog要了数据才过的。而且代码写的不好。将就看一下吧。

/*************************************************************************
Author: WHU_GCC
Created Time: 2000-9-10 14:03:51
File Name: pku3375.cpp
Description: 
***********************************************************************
*/

#include 
<iostream>
using namespace std;

#define out(x) (cout << #x << ": " << x << endl)
typedef 
long long int64;
const int maxint = 0x7FFFFFFF;
const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL;
template 
<class T> void show(T a, int n) for (int i = 0; i < n; ++i) cout << a[i] << ' '; cout << endl; }
template 
<class T> void show(T a, int r, int l) for (int i = 0; i < r; ++i) show(a[i], l); cout << endl; }

const int maxm = 100010;

int n, m;
int interface[maxm];
int computer[maxm];
int f[2][maxm];
int last[2];

int main()
{
    
while (scanf("%d%d"&m, &n) != EOF)
    
{
        
for (int i = 1; i <= m; i++)
            scanf(
"%d"&interface[i]);
        
for (int i = 1; i <= n; i++)
            scanf(
"%d"&computer[i]);
        
        sort(
interface + 1interface + 1 + m);
        sort(computer 
+ 1, computer + 1 + n);

        
for (int i = 0; i <= m; i++)
            f[
1][i] = maxint;

        
for (int i = 0; i <= m; i++)
            f[
0][i] = 0;

        last[
0= 0;

        
for (int i = 1; i <= n; i++)
        
{
            
int l = 1;
            
int r = m;
            
while (l + 1 < r)
            
{
                
int mid = (l + r) / 2;
                
if (interface[mid] >= computer[i])
                    r 
= mid;
                
else
                    l 
= mid;
            }

            
int st = max(l - n - 11);
            
int ed = min(l + n + 1, m);
            
int now = i % 2;
            
int prev = (i + 1% 2;
            last[now] 
= ed;
            
for (int j = st; j <= ed; j++)
            
{
                
if (f[prev][j - 1!= maxint)
                    f[now][j] 
<?= f[prev][j - 1+ abs(computer[i] - interface[j]);
                
else if (last[prev] < j - 1)
                    f[now][j] 
<?= f[prev][last[prev]] + abs(computer[i] - interface[j]);
                f[now][j] 
<?= f[now][j - 1];
            }

            
for (int j = 0; j <= m; j++)
                f[prev][j] 
= maxint;
        }

        
int ans = maxint;
        
for (int i = 0; i <= m; i++)
            ans 
<?= f[n % 2][i];

        printf(
"%d\n", ans);
    }

    
return 0;
}
posted on 2007-09-11 22:28 Felicia 阅读(799) 评论(1)  编辑 收藏 引用 所属分类: 动态规划
Comments

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理