九度-题目1126:打印极值点下标

来源:互联网 发布:mac 这个磁盘已被锁定 编辑:程序博客网 时间:2024/05/02 02:08
题目1126:打印极值点下标

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:5545

解决:1931

题目描述:

在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数,
或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。

输入:

每个案例的输入如下:

有2×n+1行输入:第一行是要处理的数组的个数n;
对其余2×n行,第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。

输出:

每个案例输出为n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔。

样例输入:
31010 12 12 11 11 12 23 24 12 121512 12 122 112 222 211 222 221 76 36 31 234 256 76 76 1512 14 122 112 222 222 222 221 76 36 31 234 256 76 73
样例输出:
0 72 3 4 5 6 10 120 2 3 10 12 14
来源:
2008年北京大学方正实验室计算机研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7849-1-1.html

自己的代码:
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int X(int a,int b,int c){if((b>a&&b>c)||(b<a&&b<c)){return 1;}else return 0;} int a[80][80];int m[80];int main(){int n,v;while(cin>>n){for(int i=0;i<n;i++){cin>>m[i];for(int j=0;j<m[i];j++){cin>>a[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m[i];j++){if(j==0){if(a[i][j]!=a[i][j+1]){cout<<j<<' ';}}else if(j==m[i]-1){if(a[i][j]!=a[i][j-1]){cout<<j<<'\n';}else cout<<'\n';}else if(X(a[i][j-1],a[i][j],a[i][j+1])){cout<<j<<' ';}}}}return 0;}
可是RunTime error,郁闷中。。。
不过在Dev c++中确实运行正常啊。。。不明白了。。
总结:(过段时间在写,,,)



呃,原来RE的原因是数组开小了,,,因为题目并没有说多少数据,我就先定义了100,事实证明小了点,改成1000,果然,从原来的RE,换为PE了,,(呵呵),说明逻辑还是没问题,不过最后一个极值之后不需要输出空格,这规定确实坑了点,,,通过增加标志位来判断,采用先输出空格,后输出数据的形式,可以解决问题,最后一个数据我也单独判断,不过可以不这样,直接判断如果是最后一个数据,则输出换行即可。

改正后的代码如下:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int X(int a,int b,int c){    if((b>a&&b>c)||(b<a&&b<c)){        return 1;    }    else return 0;}  int main(){    int n,v;         int a[1000][81];    int m[1000];    while(cin>>n){             for(int i=0;i<n;i++){            cin>>m[i];            for(int j=0;j<m[i];j++){                cin>>a[i][j];            }        }        for(int i=0;i<n;i++){            int flag;//用来判断第一个元素是否是极值            for(int j=0;j<m[i];j++){                 if(j==0){//单独判断开头元素                 if(a[i][j]!=a[i][j+1]){                    cout<<j;//第一个元素后先不输入空格。                    flag=1;                 }                else flag=0;//第一个元素不是极值。                 }                else if(j==m[i]-1){//单独判断末尾元素 ,不过还要单独考虑一种情况,//              即是最后一个不是极值,则之前的最后一个极值后不需有空格,否则就会格式错误。                     if(a[i][j]!=a[i][j-1]){                    cout<<' '<<j<<'\n';                   }                    else cout<<'\n';                }                else if(X(a[i][j-1],a[i][j],a[i][j+1])){//其余元素通过函数判断                     if(flag==1)                    cout<<' '<<j;                    else{                     cout<<j;flag=1;//表明现在的第一个极值已存在。                    }                 }                                              }        }    }    return 0;}/**************************************************************    Problem: 1126    User: cjt5047    Language: C++    Result: Accepted    Time:30 ms    Memory:1764 kb****************************************************************/


0 0
原创粉丝点击