2014년 바이두의 별 프로그램 설계 대회 - 퀄리파잉 레이스 1002 Disk Schedule(이중 유클리드 여행사 문제)

2985 단어 schedule
Problem Description은 순차적 읽기, 임의적 읽기를 포함하여 디스크에서 데이터를 읽을 필요가 많습니다.효율을 높이기 위해서는 인위적으로 디스크 읽기를 배정해야 한다.그러나 현실에서는 이런 방법이 매우 복잡하다.우리는 상대적으로 간단한 장면을 고려했다.디스크에는 많은 궤도가 있고, 모든 궤도에는 데이터를 저장하는 데 많은 섹터가 있다.우리가 특정 섹터에서 데이터를 읽으려고 할 때, 헤드는 특정한 궤도, 상세한 섹터로 이동해서 읽기 작업을 해야 한다.간단하게 하기 위해서, 만약 우리가 자기 헤드가 어떤 궤도에서 시계 바늘이나 시계 반대 방향으로 균일하게 회전할 수 있다면, 일주일 회전하는 시간은 360개의 단위 시간이다.헤드도 임의로 어떤 궤도로 이동하여 읽을 수 있으며, 점프할 때마다 인접 궤도로 이동하는 시간은 400단위 시간이며, 점프 전후 헤드가 있는 섹터의 위치는 변하지 않는다.데이터를 한 번에 읽는 시간은 10개의 단위이며, 읽기 전후 헤드가 있는 섹터의 위치는 변하지 않습니다.자기 헤드는 같은 시간에 단지 한 가지 일을 할 수 있다. 그것이 바로 궤도를 돌리거나 회전하거나 읽는 것이다.이제 디스크에서 데이터를 읽어야 합니다. 만약 모든 궤도에 읽기 요청이 있다면, 이 읽기 섹터는 궤도에 0에서 359까지 분포된 정수점 섹터, 즉 궤도의 360 등분점입니다.헤드의 시작점은 0 궤도 0 섹터입니다. 데이터를 읽을 수 없습니다.모든 읽기가 끝난 후, 헤드는 0 궤도 0 섹터의 시작점 위치로 돌아가야 합니다.말씀 좀 여쭙겠습니다.
Input에서 입력한 첫 번째 행에는 테스트 데이터의 그룹 수를 나타내는 정수 M(0문제 해결 방법:
이 문제는 유클리드 여행사의 문제 사상과 똑같다. 한 점에서 출발하여 매 점에 반복하지 않고 마지막에 기점에 도달하여 가장 짧은 거리를 구한다.
현재 배운 이것, 참고:
http://www.cppblog.com/doer-xee/archive/2009/11/30/102296.html
http://www.cnblogs.com/-sunshine/archive/2012/07/23/2605251.html
http://blog.csdn.net/xiajun07061225/article/details/8092247
코드:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1010;
const int inf=0x7fffffff;
int cas;
int n;
struct Node
{
    int t,s;
}node[maxn];
double dp[maxn][maxn];

int dis(Node a,Node b)//               (      +    )
{
    int ci=abs(a.t-b.t)*400;
    int MAX=(a.s>b.s?a.s:b.s);
    int MIN=(a.s<b.s?a.s:b.s);
    int shan=min(MAX-MIN,360-MAX+MIN);
    return ci+shan;
}
int DP(int n)//             
{
    dp[1][2]=dis(node[1],node[2]);
    for(int j=3;j<=n;j++)
    {
        for(int i=1;i<=j-2;i++)
            dp[i][j]=dp[i][j-1]+dis(node[j-1],node[j]);
        dp[j-1][j]=inf;
        for(int k=1;k<=j-2;k++)
        {
            int temp=dp[k][j-1]+dis(node[k],node[j]);
            if(temp<dp[j-1][j])
                dp[j-1][j]=temp;
        }
    }
    dp[n][n]=dp[n-1][n]+dis(node[n-1],node[n]);
    return dp[n][n];

}
int main()
{
    cin>>cas;
    while(cas--)
    {
        cin>>n;
        node[1].t=0,node[1].s=0;
        for(int i=1;i<=n;i++)
            cin>>node[i+1].t>>node[i+1].s;
        n++;
        cout<<DP(n)+10*(n-1)<<endl;//            
    }
    return 0;
}

좋은 웹페이지 즐겨찾기