qq创新大赛的一道题,求解

life02 2009-05-09 08:29:45
Description

有只企鹅叫豆豆,总是被别的企鹅欺负。豆豆在长期的隐忍之后,掌握了所有企鹅的高度和攻击力强度,还得到了一把黄金剑。在拥有了黄金剑以后,豆豆终于可以展开绝地大反击。但这把黄金剑的用法却很奇怪。

首先,豆豆第一次可以选择任何一只企鹅开始挑战。豆豆这一次必胜。

再次,当豆豆已经挑战过某一只企鹅后,再下一次的挑战对象只能是比上一名对手高,且比上一名对手攻击力强的企鹅。这样豆豆必胜。否则黄金剑会觉得打的没意思而故意发脾气输掉。豆豆还会被大家集体暴打。

面对着这把脾气很大的黄金剑,豆豆想请你帮助他计算一下,他最多可以连续击败多少只企鹅?

Input

第一行:一个数据n,代表企鹅群里除了豆豆一共有n(1 ≤ n ≤ 1000)只企鹅。
第2至第n+1行:每行2个数字。第i+1行的第一个数字为企鹅i的高度。第i+1行的第二个数字为企鹅i的攻击力。0 ≤ 高度,攻击力 ≤ 1,000,000。

Output

一个数。代表豆豆最多可以连续击败的企鹅数。
Sample Input

Sample Input #1 Sample Input #2 31 33 22 4 510 19 27 36 45 5 Sample Output

Sample Output #1 Sample Output #2 2 1
...全文
178 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2009-05-10
  • 打赏
  • 举报
回复
这种题目和创新有什么关系?
threeleafzerg007 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 life02 的回复:]
我是先按身高排序,然后在按攻击力找出最大递增子序列
这个不对吧
比如:
1 5
2 7
3 10
4 8
9 6
10 7
11 8
这个找子序列不成吧
我是求最长路径有的是佛洛依德算法
不过太慢,佩服他们用单循环写算法
望哪位大侠发发答案,仰慕一下
[/Quote]

就是单单1维的排序 最快的也就nlogn ,何况这里牵涉2维的情况。。。 单循环不可思议,如果有俺倒很想见识
liao05050075 2009-05-10
  • 打赏
  • 举报
回复
先排序,再找最长上升了序列就可以AC
f22fbi 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iambic 的回复:]
这种题目和创新有什么关系?
[/Quote]
没关系
就是ACM
噱头而已
strive0 2009-05-10
  • 打赏
  • 举报
回复
大虾快发答案,偶学习学习。。。
life02 2009-05-09
  • 打赏
  • 举报
回复
我是先按身高排序,然后在按攻击力找出最大递增子序列
这个不对吧
比如:
1 5
2 7
3 10
4 8
9 6
10 7
11 8
这个找子序列不成吧
我是求最长路径有的是佛洛依德算法
不过太慢,佩服他们用单循环写算法
望哪位大侠发发答案,仰慕一下
shexinwei 2009-05-09
  • 打赏
  • 举报
回复
不懂,帮顶!!
wwwypy 2009-05-09
  • 打赏
  • 举报
回复
我是先按身高排序,然后在按攻击力找出最大递增子序列。
evilhacker 2009-05-09
  • 打赏
  • 举报
回复
学习了~
ptcoding 2009-05-09
  • 打赏
  • 举报
回复
我的答案。。。不知道是不是有疏忽。。输入例子没什么问题啊。。就是说我wrong answer-_-!
#include <iostream>
using namespace std;
int main()
{
int n,i,j,temp1,temp2,sum1=1,sum2=1,*high,*power;
cin>>n;
high=(int *)malloc(n*sizeof(int));
power=(int *)malloc(n*sizeof(int));
for (i=0;i<n;i++)
{
cin>>high[i]>>power[i];
}
for (j=0;j<n;j++)
for (i=0;i<n-1;i++)
{
if (high[i]>high[i+1])
{
temp1=high[i];
temp2=power[i];
high[i]=high[i+1];
power[i]=power[i+1];
high[i+1]=temp1;
power[i+1]=temp2;
}
}
for (i=0;i<n-1;i++)
{
if (power[i]<power[i+1])sum1++;
else
{
power[i]=power[i+1];
high[i]=high[i+1];
}
}
for (j=0;j<n;j++)
for (i=0;i<n-1;i++)
{
if (power[i]>power[i+1])
{

temp1=high[i];
temp2=power[i];
high[i]=high[i+1];
power[i]=power[i+1];
high[i+1]=temp1;
power[i+1]=temp2;
}
}
for (i=0;i<n-1;i++)
{
if (high[i]<high[i+1]) sum2++;
else
{
high[i]=high[i+1];
power[i]=power[i+1];
}
}
if (sum1>=sum2) cout<<sum1<<endl;
else cout<<sum2<<endl;
free(high);
free(power);
return 0;
}
life02 2009-05-09
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;



int main(){

int loop;
int v;
cin>>loop;
int** qq=new int*[loop];
//输入
for(int i1=0;i1<loop;i1++){
qq[i1]=new int[2];
for(int j1=0;j1<2;j1++){
cin>>v;
*(qq[i1]+j1)=v;
}
}
//step1获得权值矩阵
int** D=new int*[loop];
for(int i=0;i<loop;i++){
D[i]=new int[loop];
for(int j=0;j<loop;j++){
if((qq[i][0]>qq[j][0])&&(qq[i][1]>qq[j][1])){
*(D[i]+j)= 1;
}else{
*(D[i]+j)= 0;
}
}
}
//step2 floyd算法得到任意两点间的权值矩阵
for(int k=0;k<loop;k++){
for(int i=0;i<loop;i++){
for(int j=0;j<loop;j++){
if(
(D[i][k]!=0)&&(D[k][j]!=0)&&(D[i][j]<(D[i][k]+D[k][j]))){
D[i][j]=D[i][k]+D[k][j];
}

}
}

}
//STEP3 求该矩阵最大值
int max=0;
for(int i3=0;i3<loop;i3++){
for(int j3=0;j3<loop;j3++){
if(D[i3][j3]>max){
max=D[i3][j3];
}

}
}
cout<<max+1<<endl;
return 0;
}

我的答案,速度太慢,求解高效算法

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧