您的位置:首页 > 其它

Uva - 111 - History Grading

2013-04-03 18:53 316 查看
题意:有n个事件,每个事件发生的年份都不同,输入n个事件发生的年份,输入学生作答时对于这n个事件的所排的年份,问最长学生排对了几个,不用连续。

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=114&problem=47

——>>理解题意重要,输入的是年份而不是事件,第i个位置为a表示第i个事件第a年发生;

状态转移方程:d[i] = max(d[i], d[j]+1);d[i]表示以第i个事件为终点的最长路;

另一个是输入方式,第一次用了while(1){}来输入学生答案,结果就TLE了,第二次改为先输入学生作答时的第一个年份,再输入剩余的n-1个年份,AC!

#include <cstdio>
#include <algorithm>

using namespace std;

const int maxn = 20 + 10;

int main()
{
int n, cmp[maxn], a[maxn], d[maxn], i, j, temp;
scanf("%d", &n);
for(i = 1; i <= n; i++) scanf("%d", &cmp[i]);       //事件i在第cmp[i]年发生
while(~scanf("%d", &temp))
{
a[temp] = 1;
for(i = 2; i <= n; i++)
{
scanf("%d", &temp);
a[temp] = i;        //学生作答:第temp年发生了事件i
}
for(i = 1; i <= n; i++) d[i] = 1;
int ret = 1;
for(i = 1; i <= n; i++)
for(j = 1; j < i; j++)
if(cmp[a[j]] < cmp[a[i]])
{
d[i] = max(d[i], d[j]+1);
ret = max(ret, d[i]);
}
printf("%d\n", ret);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: