| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1143 人关注过本帖
标题:[讨论]第六期题目,大家做做.
只看楼主 加入收藏
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
结帖率:50%
收藏
 问题点数:0 回复次数:8 
[讨论]第六期题目,大家做做.

继续做题.
Longest Ordered Subsequence

Problem description

A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK), where 1 <= i1 < i2 < ... < iK <= N. For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g., (1, 7), (3, 4, 8) and many others. All longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).

Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.


Input
The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000

Output
Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.


Sample Input
7
1 7 3 5 9 4 8

Sample Output
4

/*最长递增子序列的长度.*/

搜索更多相关主题的帖子: 题目 讨论 
2006-12-17 19:13
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

谁拿了最多奖学金

Problem description
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得; 2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得; 3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得; 4) 西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得; 5) 班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得; 只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。 现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。


Input
输入的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。


Output
输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。


Sample Input
4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1

Sample Output
ChenRuiyi
9000
28700

/*简单的结构体.*/


倚天照海花无数,流水高山心自知。
2006-12-17 19:14
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
哈哈,这两道都是NOIP的题...第一个是动态规划,第二个直接模拟计算就可以了,我都做过

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2006-12-17 19:57
hujian100
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2006-9-14
收藏
得分:0 

第二题答案 我做的 可能在输入上不符合你的要求 但算法都没问题 请指教 谢谢

#include <stdio.h>
struct student
{
char name[20];
int avar_mark;
int class_mark;
char cadre;
char west;
int paper_sum;
int bonus_sum;
}student[100];

main()
{
int N,i,j;
int bonus=0,bonus_sum=0;
printf("Please input the total number of students:");
scanf("%d",&N);
getchar();
printf("Please input the information about students!\n");
for(i=0;i<N;i++)
{
printf("\nThe No.%d student's information:\n",i+1);
printf("Name:");
gets(student[i].name);
printf("Avarage Mark:");
scanf("%d",&student[i].avar_mark);
printf("Class Mark:");
scanf("%d",&student[i].class_mark);
getchar();
printf("Cadre or Not?<y/n):");
scanf("%c",&student[i].cadre);
getchar();
printf("Western Student or Not?<y/n>:");
scanf("%c",&student[i].west);
printf("Paper Number:");
scanf("%d",&student[i].paper_sum);
getchar();
}
for(i=0;i<N;i++)
{
student[i].bonus_sum=0;
if(student[i].avar_mark>80)
{
if(student[i].paper_sum>=1)
student[i].bonus_sum+=8000;
if(student[i].avar_mark>85)
{
if(student[i].class_mark>80)
student[i].bonus_sum+=4000;
if(student[i].west=='y')
student[i].bonus_sum+=1000;
if(student[i].avar_mark>90)
student[i].bonus_sum+=2000;
}
}
if(student[i].class_mark>80&&student[i].cadre=='y')
student[i].bonus_sum+=850;
}
for(i=0;i<N;i++)
{
bonus_sum+=student[i].bonus_sum;
if(student[i].bonus_sum>bonus)
{
bonus=student[i].bonus_sum;
j=i;
}
}
printf("\n%s\n",student[j].name);
printf("%d\n",bonus);
printf("%d\n",bonus_sum);
}


2006-12-18 23:42
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

是题目太简单了.怎么没几个人看一下.
SHW...


倚天照海花无数,流水高山心自知。
2006-12-22 11:28
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
善始善终.

倚天照海花无数,流水高山心自知。
2006-12-23 20:17
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

#include<stdio.h>

int main()
{
int n,i,j,k,max,summax=1,a[1001],m[1001];
scanf("%d",&k);
while(k--)
{
summax=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
m[1]=1;
for(i=2;i<=n;i++)
{
max=1;
for(j=i-1;j>=1;j--)
{
if(a[i]>a[j]&&m[j]>=max)
{
max=m[j]+1;
}
}
m[i]=max;
if(m[i]>summax)
{
summax=m[i];
}
}
printf("%d\n",summax);
if(k!=0)
{
printf("\n");
}
}

return(0);
}



倚天照海花无数,流水高山心自知。
2006-12-23 20:20
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

#include<stdio.h>
typedef struct {
char name[20];
int avg;
int grade;
char work;
char west;
int num;
long sum;
}student;

void find_Max(student data[],int n)
{
int i,k=0;
long max=0,sum=0;
for(i=0;i<n;i++)
{
if(data[i].avg>80&&data[i].num>0)
{
data[i].sum+=8000;
}
if(data[i].avg>85&&data[i].grade>80)
{
data[i].sum+=4000;
}
if(data[i].avg>90)
{
data[i].sum+=2000;
}
if(data[i].avg>85&&data[i].west=='Y')
{
data[i].sum+=1000;
}
if(data[i].grade>80&&data[i].work=='Y')
{
data[i].sum+=850;
}
if(data[i].sum>max)
{
k=i;
max=data[i].sum;
}
sum+=data[i].sum;
}
printf("%s\n%ld\n%ld\n",data[k].name,max,sum);
}


int main()
{
#ifndef ONLINE_JUDGE
freopen ("10026.txt","r",stdin);
#endif
int i,n;
student data[100];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s%d%d",&data[i].name,&data[i].avg,&data[i].grade);
getchar();
scanf("%c",&data[i].work);
getchar();
scanf("%c",&data[i].west);
scanf("%d",&data[i].num);
data[i].sum=0;
}
find_Max(data,n);
return(0);
}


倚天照海花无数,流水高山心自知。
2006-12-23 20:21
iwfy
Rank: 1
等 级:新手上路
威 望:2
帖 子:888
专家分:0
注 册:2007-2-23
收藏
得分:0 

版主就是厉害,第一个的方法我看了半天都没看明白
而我的思路简直太笨了,运行效率也太慢。
这一期怎么很少人来交流呢;我的思路给大家来批评指正;
/*定长度length ,一个结构{数字,标志位,下个指针}
所有少1个数的组合中有无满足递增的,有就是长度减1
所有少2个数的组合中有无递增的,有就是减2
所有少3个数的组合中有无递增的,有就是减3
以次类推
*/
#include "stdio.h"
int min,minlength,maxlength=1,n; //n表示总数
struct str
{
int i;
int wei; //如果此标志位是0的话就当是被去掉
struct str *next;
}*pa,*pb,*pc;
list()
{
struct str *ca;
ca=pa;
while(ca!=0)
{
if(ca->wei!=0)printf("%d ",ca->i);
ca=ca->next;
}
printf("\n");
}
int hs() //判断是否递增并计算长度
{
struct str *ca,*cb;
int i,j;
ca=pa;
while(ca->wei==0) ca=ca->next;
cb=ca->next;
maxlength=1;
for(i=0;i<minlength;i++) //判断是否递增,不是的话退出
{
while(cb->wei==0) cb=cb->next;
if(cb==0 || ca==0) break;
if(ca->i<cb->i) maxlength=maxlength+1; //递增的话maxlength+1
else break;
ca=cb;
cb=cb->next;
if(maxlength==minlength) //如果长度等与截取后的长度
{
list(); //输出子集
printf("maxlength=%d\n",maxlength); //输出长度结果
j=1; //返回1不在比较
break;
}
}
if(j==1)return 1;
else return 0;
}
int qwhs(int qw) //qw表示要去掉多少位
{
int j,k;
struct str *ca,*cb; //ca指向当前位
ca=pa;
j=qw;
maxlength=1;
while(ca!=0) //当ca不等于0的时候
{
while(ca->wei==0) //当遇到ca->wei=0的时候到下一个
if(ca==0) //当ca=0时退出
{
k=1; //k=1,函数返回
break;
}
else ca=ca->next; //ca指向下个
if(ca==0) break;
ca->wei=0; //依次在ca被排除的情况
if(j>1)
{
if(qwhs(j-1)==0) //比如要去除8位而qw还不到最后一个要去除的时候
{
k=0; //k=0,不用循环判断,直接退出
break;
}
else
{
k=1;
ca->wei=1;
}
}
else if(j==1) //比如要去除8位,刚好到第8位的时候
{
if(hs()==1) //如果=1,说明判断成功
{
k=0; //k=0,不用循环判断,直接退出
break; //进入函数hs()判断是否递增
}
else
ca->wei=1; //判断完毕把该位标志位改回1
}
ca=ca->next; //ca指向下一个继续进行
}
return k; //返回1或0
}

main()
{
int j;
while(EOF!=scanf("%d",&n))
{
if(n==1) continue;
if(n<1 || n>1000) break;
for(j=0;j<n;j++)
{
scanf("%d",&min);
pb=(struct str*)malloc(sizeof(struct str));
pb->i=min;
pb->wei=j+1;
if(j==0) pa=pc=pb;
else pc->next=pb;
pc=pb;
pb->next=0;
}
minlength=n;
if(hs()==0)
for(j=1;j<n-1;j++)
{
minlength=n-j;
if(qwhs(j)==0)
break;
}
while(pa!=0)
{
pc=pa->next;
pa->i=0;pa->wei=0;pa->next=0;
free(pa);
pa=pc;
}
}
}


英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!
2007-03-17 12:48
快速回复:[讨论]第六期题目,大家做做.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018041 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved