王道机试指南 P1

p1 结构体数组排序
核心在于1.使用结构体,2,使用sort和对应的cmp 3.字符串使用strcmp比大小
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//先创建一个结构体用来存对应的数值
struct E{
    char name[100];
    int age;
    int score;
}Stu[100];
bool cmp(E a,E b){
    //比较方式:按成绩排序,如果成绩相同就按名字字母排序
    if(a.score!=b.score)
        return a.score<b.score;
    //再按照字母排序,字符串比大小这里是个问题,使用strcmp a<b 就是<0
    int c=strcmp(a.name,b.name);
    return c<0;

   // return a.name<b.name;
}

int main()
{
    int i,n;
    while(scanf("%d",&n)!=EOF){
        for(i=0;i<n;i++)
            scanf("%s%d%d",Stu[i].name,&Stu[i].age,&Stu[i].score);//这个格式要注意
        sort(Stu,Stu+n,cmp);
        for(i=0;i<n;i++)
            printf("%s %d %d\n",Stu[i].name,Stu[i].age,Stu[i].score);
}
return 0;
}

p1;这道题的关键是在于,因为给定的值是一个范围的,所以可以直接用一个数组来存对应的数据,即数组的下标就是对应的值,数组的值就是对应的次数。
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//创建一个用来成绩次数的数组 成绩是0到100 所以有101个数字
int  sc[101];
int main()
{
    int i,n;//学生的数目
    int score1,score2;//score1是学生成绩,score2是对应的就是统计成绩
    //初始化数组
    memset(sc,0,sizeof(sc));
    while(scanf("%d",&n)!=EOF&&n!=0){
    for(i=0;i<n;i++){
       scanf("%d",&score1);
       sc[score1]++;//对应位置加一
    }
    scanf("%d",&score2);
    printf("%d\n",sc[score2]);
    }

}

排版题
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//也就是给定一个n,他的长和高都是n
//所以我的想法是,创建一个n*n的二维数组,然后第一行也就是i等于0的时候 *有i+n个 所以空格是n-(i+n)个
char Str[100][100];
int main()
{
    int i,j,n;//输入n个值 所以底是2*n
    scanf("%d",&n);
    for(i=0;i<n;i++){
        //每一行,空格数都是2*n减去(i+n)也就是n-i 都是空格
        for(j=n-i-1;j>=0;j--)
            Str[i][j]=' ';
        for(j=n-i;j<2*n;j++)
            Str[i][j]='*';
    }
    for(i=0;i<n;i++)
    for(j=0;j<2*n;j++){
    printf("%c",Str[i][j]);
    if(j%8==0)
        printf("\n");
    }

}

查找的问题
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//找数字
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        int a[n];
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        int key;//输入目标值
        scanf("%d",&key);
        bool flag=false;
        for(int i=0;i<n;i++){
            if(a[i]==key){
                flag=true;
                printf("%d\n",i);
            }
        }
        if(!flag)
            printf("-1\n");
    }



}

结构体数组的查找

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//创建一个学生结构体数组
struct M{
    char Str[20];
    char name[20];
    char sex[3];
    int score;//分别是学号,姓名,性别,和分数
}Stu[30];
int main()
{
    char S_s[20];//用来输入学生的学号
    bool flag=false;
    int i;
    int n,m;//n个学生,m次查询
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%s%s%s%d",Stu[i].Str,Stu[i].name,Stu[i].sex,&Stu[i].score);//别忘记了 输入是%s 也就是字符串数组的时候,是不需要加&
    scanf("%d",&m);
    while(m--){
        scanf("%s",S_s);
        for(i=0;i<n;i++){
            if(strcmp(Stu[i].Str,S_s)==0){
            flag=true;
            printf("%s %s %s %d\n",Stu[i].Str,Stu[i].name,Stu[i].sex,Stu[i].score);
            }
        }
        if(!flag)
            printf("no answer\n");
    }

}

贪心算法:
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
//贪心 一般都是伴随一个结构体数组
struct M{
    int j;
    int f;
    double  rest;//分别代表数量,价值,和性价比
}Mou[100];
//而贪心的话,就是用过性价比来判断的,所以需要写一个比较函数来把性价比最大的找出来
bool  cmp(M a,M b){
    return a.rest>b.rest;
}
int main()
{
    int i,m, n;
    while(scanf("%d%d",&m,&n)!=EOF&&m!=-1&&n!=-1){
    double sum=0;
    for(i=0;i<n;i++){
        scanf("%d%d",&Mou[i].j,&Mou[i].f);
        Mou[i].rest=1.0*Mou[i].j/Mou[i].f;
    }
    //再进行排序
    sort(Mou,Mou+n,cmp);
    //开始判断
    for(i=0;i<n;i++){
        if(m>=Mou[i].f){//如果比全都的都多的话,那就全都放进去
            sum+=Mou[i].j;
            m-=Mou[i].f;
        }
        if(m<Mou[i].f&&m>Mou[i].rest){//买不起全部,但是可以买得起部分
                sum+=m*Mou[i].rest;
                break;

        }
    }
    printf("%.3f\n",sum);
    }
}

发布了88 篇原创文章 · 获赞 5 · 访问量 3539

猜你喜欢

转载自blog.csdn.net/qq_41115379/article/details/105134973