2009ACM多校联合暑期集训(8)——北京师大专场

 http://acm.hdu.edu.cn/showproblem.php?pid=2876

http://acm.hdu.edu.cn/forum/read.php?tid=14132

 

2876 Ellipse, again and again——ac.

  计算几何题。可以用模拟的方法做,也可以推规律,一开始模拟一直有错,最后关头随便凑了下规律,竟然过了,运气啊运气。

 

2879 HeHe——赛后ac.

  这题在比赛时我已经推出了规律,但其实即使推出了当时应该也做不出的,因为要求在大范围内求素数,赛后新学这种方法,贴一下:

 int i,j,tot=0;
    prim[tot++]=2;
    memset(hash,false,sizeof(hash));

   

     for

(i=3;i<10000000;i+=2 (i = 3 ;i < 10000000 ;i += 2

)
    {

            if
(!hash[i])
            {

              prim[tot++]=i;

                 if
(i<3200)
                 {

                     for
(j=i*i;j<10000000;j+=i)
                         hash[j]=1
;
                 }
            }
    }
   

2879 Jack's struggle——赛后ac.

      这题比赛时没有真正的去做,但赛后看了解题思路还是很清楚的,用到了求最长递增子序列类似的dp算法。

 

最长递增子序列的代码贴下:

/*
简单的动态规划,类似于最长上升子序列的求解方法。

把所有任务按照完成时间排序,之后就是求最长上升子序列,这里的两个任务之间的大于关系定义为任务i 大于任务 j,
当且仅当任务i的完成时间和任务j的完成时间之差不小于两任务完成地点之间的曼哈顿距离。*/

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 10010
using namespace std;

struct
Node
{

    int
x, y, t;
};

Node node[N];
int
n, m;
int
dp[N];
bool
cmp(Node a, Node b)
{

    return
a.t < b.t;
}


int
main()
{

    while
(scanf("%d %d", &n, &m) && (n || m))
    {

        int
i, j;
        for
(i = 0; i < m; i++)
            scanf("%d %d %d", &node[i].t, &node[i].x, &node[i].y);
        sort(node, node + m, cmp);
        int
maxNum = 0;
        for
(i = 0; i < m; i++)
        {

            int
temp = 0;
            dp[i] = 1;
            for
(j = i - 1; j >= 0; j--)//找到当前点能完成的任务的最大个数
                if (temp < dp[j] && abs(node[i].x - node[j].x) + abs(node[i].y - node[j].y) <= node[i].t - node[j].t)
                    temp = dp[j];
            dp[i] = temp + 1;
            if
(dp[i] > maxNum) maxNum = dp[i];
        }

        printf("%d/n", maxNum);
    }

    return
0;
}

    

你可能感兴趣的:(算法,任务)