| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2478 人关注过本帖
标题:看到一个很好的题,写了半天,没调出来。大家一起研究看看。
只看楼主 加入收藏
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
Name: "zhougc" Problem ID "ct8_2"
Submit Time: 2009/9/14-13:46

G++: Compile OK

Test  1:    Runtime Error
--------------------------------
Problem ID     ct8_2
Test Result    Runtime Error
Total Time     NULL
Total Memory   24 Kb / 65000 Kb
Code Length    291 Bytes


是这个么?
2009-09-16 14:30
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
Name: "StarWing" Problem ID "ct8_2"
Submit Time: 2009/5/14-00:10

G++: Compile OK

Test  1:    Accepted    Time = 0 ms
Test  2:    Accepted    Time = 20 ms
Test  3:    Accepted    Time = 3216 ms
Test  4:    Accepted    Time = 3152 ms
--------------------------------
Problem ID     ct8_2
Test Result    Accepted
Total Time     6388 ms
Total Memory   4032 Kb / 65000 Kb
Code Length    884 Bytes

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-09-16 14:55
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
partition写了6行是因为ct8_2居然用普通的快速选择算法过不了,这个是随机快速选择算法。

程序代码:
#include <iostream>
#include <cstdlib>
int s[1000001];
int partition(int *a, int len)
{
    int i, j = 0;
    std::swap(a[0], a[rand() % len]);
    for (i = 1; i < len; ++i)
        if (a[i] > a[0]) ++j, std::swap(a[i], a[j]);
    std::swap(a[0], a[j]);
    return j;
}
int quick_select(int *a, int len, int i)
{
    int k = partition(a, len);
    if (k == i) return a[k];
    return k > i ? quick_select(a, k, i)
           : quick_select(&a[k + 1], len - k - 1, i - k - 1);
}
int main(void)
{
    int i, n, k;
    while (scanf("%d%d", &n, &k) == 2)
    {
        for (i = 0; i < n; ++i)
            scanf("%d", &s[i]);
        printf("%d\n", quick_select(s, n, k - 1));
    }
    return 0;
}

Name: "StarWing" Problem ID "ct8_2"
Submit Time: 2009/9/16-15:28

G++: Compile OK

Test  1:    Accepted    Time = 0 ms
Test  2:    Accepted    Time = 21 ms
Test  3:    Accepted    Time = 3188 ms
Test  4:    Accepted    Time = 3929 ms
--------------------------------
Problem ID     ct8_2
Test Result    Accepted
Total Time     7138 ms
Total Memory   4032 Kb / 65000 Kb
Code Length    730 Bytes

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-09-16 15:30
地狱无明火
Rank: 2
等 级:论坛游民
帖 子:62
专家分:71
注 册:2009-6-11
收藏
得分:0 
程序代码:
/* VC 环境 */
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    int numStud;
    int i;
    int first  = 0;
    int second = 0;
    int third  = 0;
    int count  = 0;
    int a[100];
    int *ary;

    //输入同学人数
    do
    {
        printf("Number of Student: ");
        scanf("%d", &numStud);
        //限制人数范围,违规循环
        if(numStud < 0 || numStud > 10000)
            printf("Error Input Students' Number!\n");
    }while(numStud < 0 || numStud > 10000);

    //如果不是键入0
    while(numStud != 0)
    {  
        //准备储存空间
        ary = (int*)malloc(numStud*sizeof(ary));

        //输入同学的分数存入数组
        for(i = 0; i < numStud; i++)
        {
            do
            {
                printf("Mark of Student %d: ", i + 1);
                scanf("%d", &ary[i]);
                //限制分数范围,违规循环
                if(ary[i] < 0 || ary[i] > 100)
                    printf("Error Input Mark!\n");
            }while(ary[i] < 0 || ary[i] > 100);
        }//end for


        printf("\n");


        //寻找最高分
        for(i = 0; i < numStud; i++)
            if(ary[i] > first)
                first = ary[i];

        //找最高分,然后与第一高分比较,小者得次高
        for(i = 0; i < numStud; i++)
            if(ary[i] > second && ary[i] < first)
                second = ary[i];

        //找最高分,然后与第二高分比较,小者是第三
        for(i = 0; i < numStud; i++)
            if(ary[i] > third && ary[i] < second)
                third = ary[i];

        //清除数据之前,将第三高分赋值给另一数组
        //如果没有第三高分,这里的third其实是第二高分,赋值0以方便输出那个no such score
        if(third == second)
            a[count] = -1;
        else a[count] = third;

        count++;//计算循环次数

        //清除数组数据
        free(ary);

        //还有其他组要输入的话,这里输入同学人数,输入0可结束循环看结果
        do
        {
            printf("Number of Student: ");
            scanf("%d", &numStud);
            //限制输入范围,违规循环
            if(numStud < 0 || numStud > 10000)
                printf("Error Input!\n");
        }while(numStud < 0 || numStud > 10000);


    }//end while


    //结果输出
    printf("\n\nThe Third Student's Mark: \n");
    for(int i = 0; i < count; i++)
    {
        if(a[i] == 0)
            printf("No such Score!\n\n");
        else printf("%d\n",a[i]);
    }
    
    return 0;
}


学习了
2009-09-16 15:46
cjl312969517
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-9-16
收藏
得分:0 
看不懂···在学习中
2009-09-17 15:43
已屏蔽
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:89
专家分:124
注 册:2009-9-5
收藏
得分:0 
看不懂。。。- -
 
话说,随机指定一个数的话,第一次的时候把数据分成类似10个组(0-9分,10-19分。。。90-100分),根据每个组的人数选出所要的分数在哪个组,再挑,这样一直下来也可以把
2009-09-17 20:59
cjl312969517
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-9-16
收藏
得分:0 
噢··i  see  i see!!!
2009-09-18 17:43
浴雪希灵
Rank: 2
等 级:论坛游民
帖 子:23
专家分:30
注 册:2009-11-12
收藏
得分:0 
程序代码:
#include"stdio.h"
void li(int a[],int p)
{
    int i,j,m=0,t;
    for(i=1;i<=p;i++)
        scanf("%d",&a[i]);
    for(j=0;(j<=p-1)&&(m<2);j++)
    {    for(i=p;i>j+1;i--)
            if(a[i]>a[i-1])
            {
                t=a[i-1];
                a[i-1]=a[i];
                a[i]=t;
            }
            a[0]=a[1];
            if(a[j]!=a[j+1])
                m++;
    }
    if(m==2)
            printf("第三名成绩:%d\n",a[j]);
    else 
        printf("no");
}
            
 main()
{
    int x[50],p;
    printf("请输入人数:\n");
    scanf("%d",&p);
    while(p!=0)
    {
        li(x,p);
        printf("\n");
           scanf("%d",&p);
    }
    return 0;
}
上面这个行吗?
2009-11-18 23:31
smltq
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:566
专家分:400
注 册:2008-1-21
收藏
得分:0 
没记错的话,这应该是飞燕新手区里的一水题……

简单的生活
2009-11-23 16:23
快速回复:看到一个很好的题,写了半天,没调出来。大家一起研究看看。
数据加载中...
 
   



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

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