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;
}