读书人

几道略有难度的C语言题 求高人给出源代

发布时间: 2012-04-07 17:31:51 作者: rapoo

几道略有难度的C语言题 求高人给出源代码
A:大学的大楼
时间限制: 1000ms
内存限制: 10000kB
描述
大学中的高富帅,天天在盖高楼,不断扩张。校长请ACM团队统计一下学校的高楼。请你讲学校的高楼排个序,按楼的高度从高到低,若高度相同,则占地面积大的在前,假设所有高楼都是规则的长方体。
输入
输入T组数据,第一行输入T,每组第一行输入一个n,表示楼的个数,接下去n行输入n个楼的长、宽、高,都是整数。(每个楼都有个序号,1~n号楼顺序输入)
输出
输出排序后楼的序号顺序。
样例输入
2
2
1 2 3
2 2 4
3
1 1 1
2 2 2
3 3 3
样例输出
2
1
3
2
1

B:上楼梯
时间限制: 1000ms
内存限制: 10000kB
描述
一个人上楼梯,他可以一步上1级,可以一步上2级,也可以
一步上3级,现在楼梯一共有N级,有多少种不同的上法
(注意:当上到还剩下1级就到达时,不能直接上2级且不能
直接上3级,当上到还剩下2级就到达时,不能直接上3级),
输入
输入第一个数是M,表示M组测试数据,接下来有M行,每组测试数
据一行,为一个N(1<=N<=35)
输出
对于每一个测试数据,输出对应的不同的上楼梯方法
样例输入
3
1
5
10
样例输出
1
13
274

C:集合合并
时间限制: 3000ms
内存限制: 50000kB
描述
已知集合A与集合B,且第个集合内数据是唯一的。求A,B集合合并成新的集合C,要求C集合内的数据也是唯一的。并指出C集合的个数。
输入
三行,第一行分别为集合A,B的个数
第二行为A集合的数据
第三行为B集合的数据
输出
两行
第一行集合C的个数
第二行为C集合的数据
样例输入
4 5
12 34 56 78
34 67 89 34 76
样例输出
7
12 34 56 78 67 89 76
提示
数据小于30000

D:mirror number
时间限制: 1000ms
内存限制: 100000kB
描述
像1,101,2552这样对称的数,我们称它为mirror number,前10个mirror
number为1,2,3,4,5,6,7,8,9,11。以此类推。
请你求出第N个对称的数。
输入
第一行输入T,T组测试数据,接下去每组数据占一行,输入一个N(1<=N<=100000)。
输出
输出第N个mirror number,每组占一行。
样例输入
3
2
11
15
样例输出
2
22
66

E:有人说这是acm题
时间限制: 1000ms
内存限制: 10000kB
描述
最近一个老师和我们说,我给你们布置一个acm题。题目是这样的,给定矩阵大小,请你输出一个蛇形的字符串矩阵。从左上角开始蛇形顺时针转,从A开始按26个大写字母顺序,到Z后再回到A。你们说这个题难吗??
输入
第一行输入T,表示输入T组数据。每组占一行,分别输入n,m表示行数和列数。(1<=n,m<=50)
输出
输出矩阵。
样例输入
3
2 2
3 5
10 5
样例输出
AB
DC
ABCDE
LMNOF
KJIHG
ABCDE
ZABCF
YRSDG
XQTEH
WPUFI
VOVGJ
UNWHK
TMXIL
SLKJM
RQPON

F:取糖果
时间限制: 1000ms
内存限制: 10000kB
描述
女生节到了,ACM团队要给ACM的女生们发糖果啦,不过调皮的男生要写考考女生们一个小问题。
把n个糖果连成一排,要把这些糖果拿光,刚开始可以任取一个,接下去只能取“有相邻的糖果被取走”的糖果,例如刚开始有5个糖果,刚开始取走第3个,第二步只能取第2或第4个,以此类推。给出n,问将糖果取光的方法有多少种。两种取法只要有某次取的糖果不一样就视为不同。
输入
输入T组数据,第一行输入T。
接下去T行,每组数据输入一个整数n(1<=n<=100)。
输出
每组数据输出一行,为将糖果取光的方法数,结果模1000000007。
样例输入
2
1
2
样例输出
1
2


[解决办法]
慢慢写吧,先送上第一题

C/C++ code
#include<stdio.h>/*使用结构体来表示大楼*/struct building {    int length;    int width;    int height;};int main(){    /*记录多少组数据*/    int group;    /*记录每一组数据里面有多少个大楼,我假定的最多50,这个可以是N*/    int count[50];    int i, j, k;    /*记录总共有多少个大楼*/    int temp = 0;    /*记录输入的大楼,假定最多100个大楼*/    struct building building[100];    /*中间变量,排序时使用*/    struct building tempBuilding;    printf("Please enter the group of data:");    scanf("%d", &group);    for(i=0;i<group;i++){        printf("Please enter the count of building:");        scanf("%d", &count[i]);        for(j=0; j< count[i]; j++){            printf("Please enter the length width height of this building:");            scanf("%d%d%d", &building[temp].length, &building[temp].width, &building[temp].height);            temp ++;        }    }    /*对每一组的大楼进行排序,时间复杂度不够好,不过对于这题的要求是没有关系的,凑合着使吧*/    for(i=0;i<group;i++){        for(j=i*group;j<(count[i]-1)*group;j++){            for(k=j;k<(count[i]-1)*group;k++){                if(building[j].height < building[k+1].height){                    tempBuilding = building[k+1];                    building[k+1] = building[j];                    building[j] = tempBuilding;                }                else if(building[j].height == building[k+1].height && building[j].length*building[j].width < building[k+1].length*building[k+1].width){                    tempBuilding = building[k+1];                    building[k+1] = building[j];                    building[j] = tempBuilding;                }            }        }    }    /*输出排序后的大楼*/    for(i=0;i<temp;i++){        printf("%d\t%d\t%d \n", building[i].length, building[i].width, building[i].height);    }    getch();    return 0;} 


[解决办法]
第一题:

C/C++ code
#include <stdlib.h>#include <stdio.h>#include <memory.h>typedef struct _building{    int building_id;    /* 每组建筑物中的编号 */    int length;            /* 长 */    int width;            /* 宽 */    int height;            /* 高 */}building;/* 排序规则 */int comparer(const void* a, const void* b){    int result = ((building*)b)->height - ((building*)a)->height;    if(result != 0)    {        return result;    /* 如果高度不同, 则从高到低排列 */    }    else    {        /* 如果高度相同,则从面积从大到小排列 */        return ((building*)b)->height *                 ((building*)b)->length *                 ((building*)b)->width -                ((building*)a)->height *                 ((building*)a)->length *                 ((building*)a)->width;    }}int main(int argc, char** argv){    int i = 0;    int j = 0;    int k = 0;    int groups = 0;    int buildings = 0;    int length = 0;    int width = 0;    int height = 0;    building *b;    int a[1000];            /* 这里不妨假定最多是1000栋建筑, 实际中可以使用动态数组 */    int group_building = 0;    scanf("%d", &groups);    /* 获取多少组建筑 */    for(i = 0; i < groups; ++i)    {        scanf("%d", &buildings);    /* 获取每组的建筑数量 */        // b = new building[buildings];        b = (building*)malloc(buildings * sizeof(building));    /* 1. 改用C的写法,上面注释的是C++的写法 */        for(j = 0; j < buildings; ++j)        {            /* 获取每个建筑的参数 */            scanf("%d %d %d", &length, &width, & height);            (*(b + j)).building_id = j + 1;            (*(b + j)).length = length;            (*(b + j)).width = width;            (*(b + j)).height = height;        }        /* 快排 */        qsort(b, buildings, sizeof(building), comparer);        /* 将快排结果存入数组a中 */        for(j = 0; j < buildings; ++j)        {            a[group_building + j] = (*(b + j)).building_id;        }        group_building += buildings;        free(b);    /* 2. 增加这句,防止内存泄露 */    }    /* 输出结果 */    for(k = 0; k < group_building; ++k)    {        printf("%d\n", a[k]);    }    return 0;}
[解决办法]
第二题递归吧,高中数学忘了 不知归纳的对不
C/C++ code
#include <iostream>using namespace std;int floor(int n){    if(n == 1)        return 1;    if(n == 2)        return 2;    if(n == 3)        return 4;    return floor(n - 3) + floor(n - 2) + floor(n - 1);}    int main(){    int n;    cin >> n;    int result = floor(n);    cout << result << endl;    return (0);}
[解决办法]
第四题提供一个不用穷举的思路
C/C++ code
#include <iostream>#include <vector>#include <sstream>using namespace std;vector<int> result;void add1(){    for(int i = 1; i < 10; i++)    {        stringstream ss;        ss << i;        result.push_back(atoi(ss.str().c_str()));    }        }void add2(){    for(int i = 1; i < 10; i++)    {                    stringstream ss;            ss << i << i;            result.push_back(atoi(ss.str().c_str()));            }}void add3(){    for(int i = 1; i < 10; i++)    {        for(int j = 0; j < 10; j++)        {            stringstream ss;            ss << i << j << i;            result.push_back(atoi(ss.str().c_str()));        }    }}void add4(){    for(int i = 1; i < 10; i++)    {        for(int j = 0; j < 10; j++)        {            stringstream ss;            ss << i << j << j << i;            result.push_back(atoi(ss.str().c_str()));        }    }}    void add5(){    for(int i = 1; i < 10; i++)    {        for(int j = 0; j < 10; j++)        {            for(int k = 0; k < 10; k++)            {                stringstream ss;                ss << i << j << k << j << i;                result.push_back(atoi(ss.str().c_str()));            }        }    }}void add6(){    for(int i = 1; i < 10; i++)    {        for(int j = 0; j < 10; j++)        {            for(int k = 0; k < 10; k++)            {                stringstream ss;                ss << i << j << k << k<< j << i;                result.push_back(atoi(ss.str().c_str()));            }        }    }}    int main(){    add1();    add2();    add3();    add4();    add5();    add6();    int n, m;    cin >> n;    for(int i = 0; i < n; i++)    {        cin >> m;                cout << result[m - 1] << endl;    }        return 0;} 

读书人网 >C语言

热点推荐