一道c语言题目 求大神指点下算法?

作者&投稿:恽蚀 (若有异议请与网页底部的电邮联系)
有一道C语言的题目请教~~求高效算法~!!!~

不知这样可否:调用库函数中的quicksort()分别对N和M这两组数据建行排序;
然后修改折半排序的 判读(具体怎么判定那就看你怎么设计了) 条件,进行选择,时间复杂度为(M*log2 (n))!(n为m 与N中的较大值)不过排序时也要时间哦!但是M和N都可能比较大,我觉得先排序在查找比较好,呵呵....

你应该也是搞ACM的吧?

当然,本人个人觉得本题在某种意义上说,要揣测出题的测试数据才能设计出最好的算法...~~

-----------------------------------
char str[100];
printf("请输入一个字符串:
");
scanf("%s",str);
printf("转换前字符串为:
%s
");
inverse(str);
-----------------------------------
开始的时候,弄一个长度最多为100的char数组,然后把这个数组作为参数给inverse这个function.inverse得到这个参数之后开始运行。
-----------------------------------
for(i=0,j=strlen(str);i<j;i++,j--)
{
t=str[i];
str[i]=str[j-1];
str[j-1]=t;
}
-----------------------------------
for(起始条件;运行条件;每一循环结束后的附加计算)
这个for的起始条件是:i=0 而且 j=参数数组的具体长度(strlen取得数组的具体长度,而不是最大长度)
size_t strlen ( const char * str );
Returns the length of str.
http://www.cplusplus.com/reference/clibrary/cstring/strlen/
这个for的运行条件是:i < j。也就是说,只要i<j,那么就运行for后面大括号的内容。
每一循环结束后的附加计算:i = i + 1; j = j - 1.

如果数组是 abcdefg
那么第一次循环 i = 0, j = 7;
第二次循环 i = 1, j = 6;
第三次 i = 2, j = 5;
...

希望楼主能明白

根据题意,随机生成红绿蓝球任意个数,并任意顺序排列。这里采用随机数实现。

统计按红绿蓝顺序排列最少交换次数,我的思路是:

第一步:循环将最后一个红色球与最靠前的其它两色球(并且满足位置在红球之前)交换。

第二步:循环将最后一个绿球与最靠前的蓝球(必须在绿球之前)交换。

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define MR 5//每种颜色的球随机生成的最大数量

void  showList(int qs[],int len);

int jh(int qs[],int len);//返回交换次数

int main()

{

    int i,len,qs[MR*3],n;

    int r,g,b;//红绿蓝数量

    srand(time(NULL));

    r=rand()%MR+1;//1~MR的随机数

    g=rand()%MR+1;

    b=rand()%MR+1;

    len=r+g+b;

    printf("随机生成红球%d个,绿球%d个,篮球%d个
",r,g,b);

    printf("开始随机排列。。。。。。
");

    for(i=0;i<len;i++)

    {

        n=rand()%3+1;//位置采取抽签,生成1~3的随机数,1表示红,2表示绿,3表示蓝

        switch(n)

        {

            case 1:

                if(r>0) qs[i]=n,r--;

                else i--;

                break;

            case 2:

                if(g>0) qs[i]=n,g--;

                else i--;

                break;

            case 3:

                if(b>0) qs[i]=n,b--;

                else i--;

                break;

        }

    }

    printf("随机排列后的队列情况为:
");

    showList(qs,len);

    printf("
");

    jh(qs,len);

    return 0;

}

int jh(int qs[],int len)//返回交换次数

{

    int cnt=0;

    int jhbl(int qs[],int len,int lq,int bq);

    //最后的红和最前的绿或蓝(且绿球或篮球位置在红球之前)交换

    cnt+=jhbl(qs,len,1,0);

    //最前的篮球和最后的绿球交换

    cnt+=jhbl(qs,len,2,3);

    printf("总交换次数至少%d:
",cnt);

    return cnt;

}

int jhbl(int qs[],int len,int lq,int bq)//lq:交换中最靠后的球色编号(1~3),bq:交换中最靠前的球色编号(1~3),bq=0:lq与其他两种颜色任意交换

{

    int i,j,qSave,cnt=0;

    for(i=len-1;i>=0;i--)

    {

        if(qs[i]==lq)

        {

             for(j=0;j<len;j++)

                if(((bq==0 && qs[j]!=lq)||(bq!=0 && qs[j]==bq)) && j<i)

                {

                     printf("第%d个%s%s%s与第%d个%s%s%s交换,交换后(交换%d次):
",i+1,lq==1?"红球":"",lq==2?"绿球":"",lq==3?"蓝球":"",j+1,qs[j]==1?"红球":"",qs[j]==2?"绿球":"",qs[j]==3?"蓝球":"",cnt+1);

                     qSave=qs[j],qs[j]=qs[i];qs[i]=qSave,cnt++;

                     showList(qs,len);

                     printf("
");

                     i=len-1;

                     break;

                }

        }

    }

    return cnt;

}

void  showList(int qs[],int len)

{

    int i;

    for(i=0;i<len;i++)

        printf("%s%s%s ",qs[i]==1?"红":"",qs[i]==2?"绿":"",qs[i]==3?"蓝":"");

    printf("
");

}



你好,
按我的理解,可以将红球看做1,绿球看做2,篮球看做3.
排序最快的应该是快排。
祝你生活愉快。

能把原题复制过来不,你语言描述得不清晰


天山区15157498526: 请教一道简单的C语言题目,求大神解答 -
系昌金裕: 你没考虑到相邻两个数相等你情况.你看样例第四组数开头有两个7,输出是-1,说明严格递增是a[i+1]>=a[i],严格递减是a[i]>=a[i+1].

天山区15157498526: 求大神!!!c语言题目,要方法就可以了,谢谢! -
系昌金裕: #include int main() { char str[500]; char *cp; int sum, sum2; while(scanf("%s", str)!=EOF) { cp = str; sum = sum2 = 0; if(*cp=='0' && *(cp+1)=='\0') break; while(*cp != '\0') { sum += *cp-'0'; cp++; } while(sum>9) { sum2 += sum%10; sum /= 10; if(sum { ...

天山区15157498526: 求本道题C语言解法 -
系昌金裕: #include int main(){ char strN[50][50]; int Num,i,j,k,flag,Len; scanf("%d%*c", for(i=0;i<Num;i++) scanf("%s%*c",strN[i]); for(i=0;i...

天山区15157498526: 帮忙想想这道C语言题的算法
系昌金裕: 这就是约瑟夫问题,有一种是要通过输入n,m,k三个正整数(这里m=3,k=1),来求出列的序列.这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素. p->link=head 解决问题的核心步骤: 1.建立一个具有n...

天山区15157498526: 求大神解答该C语言问题的简便算法 -
系昌金裕: 这种题,如果没有对子集进行其他约束,比如关系之类的,没有公式可套,只能穷举的,要说简便或快捷算法,只能利用倒推穷举法,就是用m的值和1~n中的子集,从中采用减法剔除筛选出所有子集,并同时给出相应的子集大小,最后给出总数以及符合子集大小要求的子集.代码就不写了.这个实际上就是穷举算法,只是穷举的方式不同而已.

天山区15157498526: 求大神帮忙指点一下C语言编程作业吧~!!1.设计求完全平方数的函数,其功能是:在3位整数(100—999)中寻找既是完全平方数(某个数的平方),又... -
系昌金裕:[答案] 1 #include #include int find_complete(int b[]) { int i; int cnt=0; int j=10; for(i=100;i { int single = i%100%10; int ten = i%100/10; int hundred = i/100; if(single == ten || ten == hundred || single == hundred) { for(j=10;j { if(j*j == i) { b[cnt++] = i; } } } } return cnt; } ...

天山区15157498526: 一道c语言编程题,求大神指教! -
系昌金裕: #include <stdio.h> void printdigits( int n ); int main() { int n; scanf("%d", &n); printdigits(n); return 0; } void printdigits( int n ) { if(n) { printdigits(n/10); printf("%d\n",n%10); } }

天山区15157498526: 一道C语言编程题(最好把算法也写一下哈~)
系昌金裕: 来 给 把I J K 都算出来了#include <stdio.h> main() { int i,j=0,k=0; for(i=1;i<=9;i++) {j=2*i;if(j<10&&j!=0){k=3*i;if(k<10&&k!=0&&k!=j){printf("i=%d,j=%d,k=%d\n",i,j,k);}}} }

天山区15157498526: 一道c语言的题 求大神帮忙 -
系昌金裕: #include<stdio.h> void main() { char cbegin; //起始字符 int icount,i; //数量 printf("please input a char and a number: "); scanf("%c %d",&cbegin,&icount);//输入 printf("\nresult: "); for(i=0;i<icount;i++)printf("%c",cbegin+i); //输出printf("\n"); }

天山区15157498526: c语言编程题求大神指教,,太笨了,想了一下午都做不出结果s=(2+3)+(2+3+5)+(2+3+5+8) -
系昌金裕: 供你参考……#include "stdio.h"void main(void){ int n,i,j,k,s; printf("Type an integer...\nn="); scanf("%d",&n);//表示几项 for(s=0,i=2,j=3,k=5;n;n--){ (s+=s)+=k; k=i+j; i=j; j=k; } printf("The result is %d.\n",s);}

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网