复试上机题-经典入门

源于《2013年王道论坛计算机考研机试指南》与牛客网计算机考研复试上机题

1.排序

KY210 排序

在这里插入图片描述

my:

#include<iostream>
using namespace std;
int str[110];

int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>str[i];
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n-i-1;j++){
            if(str[j]>str[j+1]){
                int temp=str[j];
                str[j]=str[j+1];
                str[j+1]=temp;
            }
        }
    }
    for(int i=0;i<n-1;i++){
        cout<<str[i]<<" ";
    }
    cout<<str[n-1];
    return 0;
}

better(升序):

#include<iostream>
#include<algorithm>
using namespace std;
int str[110];

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
	    for(int i=0;i<n;i++){
	        scanf("%d",&str[i]);
	    }
		sort(str,str+n);
	    for(int i=0;i<n-1;i++){
	        printf("%d ",str[i]);
	    }
	    cout<<str[n-1];
	}
    return 0;
}

better2(降序):

#include<iostream>
#include<algorithm>
using namespace std;
int str[110];
bool cmp(int x,int y){
	return x>y;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
	    for(int i=0;i<n;i++){
	        scanf("%d",&str[i]);
	    }
		sort(str,str+n,cmp);
	    for(int i=0;i<n-1;i++){
	        printf("%d ",str[i]);
	    }
	    cout<<str[n-1];
	}
    return 0;
}

KY215 成绩排序

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct info{
    char name[110];
    int age;
    int grade;
}stu[1010];
bool cmp(info a,info b){
    if(a.grade!=b.grade)return a.grade<b.grade;
    if(strcmp(a.name,b.name)!=0){
        return strcmp(a.name,b.name)<0?true:false;
    }
    if(a.age!=b.age)return a.age<b.age;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s %d %d",&stu[i].name,
             &stu[i].age,&stu[i].grade);
    }
    sort(stu,stu+n,cmp);
    for(int i=0;i<n;i++){
        printf("%s %d %d\n",stu[i].name,
             stu[i].age,stu[i].grade);
    }
}

better:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct info{
    char name[110];
    int age;
    int grade;
	bool operator<(const info &b)const{
	    if(grade!=b.grade)return grade<b.grade;
	    if(strcmp(name,b.name)!=0){
	        return strcmp(name,b.name)<0?true:false;
	    }
	    if(age!=b.age)return age<b.age;
	}
}stu[1010];

int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s %d %d",&stu[i].name,
             &stu[i].age,&stu[i].grade);
    }
    sort(stu,stu+n);
    for(int i=0;i<n;i++){
        printf("%s %d %d\n",stu[i].name,
             stu[i].age,stu[i].grade);
    }
}

KY211 特殊排序

在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
int str[1010];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&str[i]);
    }
    sort(str,str+n);
    printf("%d\n",str[n-1]);
    for(int i=0;i<n-2;i++){
        printf("%d ",str[i]);
    }
    if(n-2>=0){
        printf("%d",str[n-2]);
    }else{
        printf("-1");
    }
    return 0;
}

KY145 EXCEL排序

在这里插入图片描述
attention:当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct info{
    char id[10];
    char name[10];
    int grade;
}stu[100010];
bool cmp1(info a,info b){
    return strcmp(a.id,b.id)<0;
}
bool cmp2(info a,info b){
    if(strcmp(a.name,b.name)!=0)return strcmp(a.name,b.name)<0;
    return strcmp(a.id,b.id)<0;
}
bool cmp3(info a,info b){
    if(a.grade!=b.grade)return a.grade<b.grade;
    return strcmp(a.id,b.id)<0;
}
int main(){
    int n,c;
    scanf("%d %d",&n,&c);
    for(int i=0;i<n;i++){
        scanf("%s %s %d",&stu[i].id,&stu[i].name,&stu[i].grade);
    }
    if(c==1){
        sort(stu,stu+n,cmp1);
    }else if(c==2){
        sort(stu,stu+n,cmp2);
    }else{
        sort(stu,stu+n,cmp3);
    }
    printf("Case:\n");
    for(int i=0;i<n;i++){
        printf("%s %s %d\n",stu[i].id,stu[i].name,stu[i].grade);
    }
    return 0;
}

KY168 字符串内排序

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
char str[210];
int main(){
    scanf("%s",&str);
    int n;
    for(int i=0;str[i]!=NULL;i++){
        n++;
    }
    sort(str,str+n);
    printf("%s",str);
    return 0;
}

2.日期

KY111 日期差值

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace sctd;
int mon[13][2]={0,0,31,31,28,29,31,31,30,30,31,31,30,30
    ,31,31,31,31,30,30,31,31,30,30,31,31};
char str1[10],str2[10];
int cnt=0;
int isdual(int a){
    if(a%400==0||(a%100!=0&&a%4==0))return 1;
    return 0;
}
struct Date{
    int y;
    int m;
    int d;
    void nextDay(){
        d++;
        if(d>mon[m][isdual(y)]){
            m++;
            d=1;
        }
        if(m>12){
            y++;
            m=1;
        }
        cnt++;
    }
}days;
int pos[5000][13][32];
int main(){
    scanf("%s",&str1);
    scanf("%s",&str2);
    int year1,year2,month1,month2,day1,day2;
    for(int i=0;i<=3;i++){
        year1=year1*10+str1[i]-'0';
        year2=year2*10+str2[i]-'0';
    }
    for(int i=4;i<=5;i++){
        month1=month1*10+str1[i]-'0';
        month2=month2*10+str2[i]-'0';
    }
    for(int i=6;i<=7;i++){
        day1=day1*10+str1[i]-'0';
        day2=day2*10+str2[i]-'0';
    }
    days.y=0;
    days.m=1;
    days.d=1;
    while(days.y<5000){
        pos[days.y][days.m][days.d]=cnt;
        days.nextDay();
    }
    //cout<<pos[2011][4][12]<<" "<<pos[2011][4][22]<<endl;
    //cout<<year2<<month2<<day2<<endl;
    printf("%d\n",pos[year2][month2][day2]-pos[year1][month1][day1]+1);
    return 0;
}

better:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace sctd;
int mon[13][2]={0,0,31,31,28,29,31,31,30,30,31,31,30,30
    ,31,31,31,31,30,30,31,31,30,30,31,31};
char str1[10],str2[10];
int cnt=0;
int isdual(int a){
    if(a%400==0||(a%100!=0&&a%4==0))return 1;
    return 0;
}
struct Date{
    int y;
    int m;
    int d;
    void nextDay(){
        d++;
        if(d>mon[m][isdual(y)]){
            m++;
            d=1;
        }
        if(m>12){
            y++;
            m=1;
        }
        cnt++;
    }
}days;
int pos[5000][13][32];
int main(){
	int year1,year2,month1,month2,day1,day2;
    scanf("%4d%2d%2d",&year1,&month1,&day1);
    scanf("%4d%2d%2d",&year2,&month2,&day2);
    days.y=0;
    days.m=1;
    days.d=1;
    while(days.y<5000){
        pos[days.y][days.m][days.d]=cnt;
        days.nextDay();
    }
    printf("%d\n",pos[year2][month2][day2]-pos[year1][month1][day1]+1);
    return 0;
}

KY108 Day of Week

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int mon[13][2]={0,0,31,31,28,29,31,31,30,30,31,31,30,30
    ,31,31,31,31,30,30,31,31,30,30,31,31};
char week[7][15]={"Sunday","Monday","Tuesday","Wednesday"
    ,"Thursday","Friday","Saturday"};
int cnt=0;
int isdual(int a){
    if(a%400==0||(a%100!=0&&a%4==0))return 1;
    return 0;
}
struct Date{
    int y;
    int m;
    int d;
    void nextDay(){
        d++;
        if(d>mon[m][isdual(y)]){
            m++;
            d=1;
        }
        if(m>12){
            y++;
            m=1;
        }
        cnt++;
    }
}days;
int pos[5000][13][32];
int convert(char str[]){
    if(strcmp("January",str)==0)return 1;
    else if(strcmp("February",str)==0)return 2;
    else if(strcmp("March",str)==0)return 3;
    else if(strcmp("April",str)==0)return 4;
    else if(strcmp("May",str)==0)return 5;
    else if(strcmp("June",str)==0)return 6;
    else if(strcmp("July",str)==0)return 7;
    else if(strcmp("August",str)==0)return 8;
    else if(strcmp("September",str)==0)return 9;
    else if(strcmp("October",str)==0)return 10;
    else if(strcmp("November",str)==0)return 11;
    else if(strcmp("December",str)==0)return 12;
}
int main(){
    int year1,month1,day1;
    char str1[15];
    scanf("%d %s %d",&day1,str1,&year1);
    month1=convert(str1);
    days.y=999;
    days.m=1;
    days.d=1;
    while(days.y<3001){
        pos[days.y][days.m][days.d]=cnt;
        days.nextDay();
    }
    int cur1=pos[year1][month1][day1]-pos[2021][7][26]+1;
    printf("%s\n",week[(cur1%7+7)%7]);
    return 0;
}

练习题:

KY19 今年的第几天?

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int mon[13][2]={0,0,31,31,28,29,31,31,30,30,31,31,30,30
    ,31,31,31,31,30,30,31,31,30,30,31,31};
int cnt=0;
int isdual(int a){
    if(a%400==0||(a%100!=0&&a%4==0))return 1;
    return 0;
}
struct Date{
    int y;
    int m;
    int d;
    void nextDay(){
        d++;
        if(d>mon[m][isdual(y)]){
            m++;
            d=1;
        }
        if(m>12){
            y++;
            m=1;
        }
        cnt++;
    }
}days;
int pos[5000][13][32];
int main(){
    int year1,month1,day1;
    scanf("%d %d %d",&year1,&month1,&day1);
    days.y=1;
    days.m=1;
    days.d=1;
    while(days.y<3001){
        pos[days.y][days.m][days.d]=cnt;
        days.nextDay();
    }
    printf("%d\n",pos[year1][month1][day1]-pos[year1][1][1]+1);
    return 0;
}

KY222 打印日期

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int mon[13][2]={0,0,31,31,28,29,31,31,30,30,31,31,30,30
    ,31,31,31,31,30,30,31,31,30,30,31,31};
int cnt=0;
int isdual(int a){
    if(a%400==0||(a%100!=0&&a%4==0))return 1;
    return 0;
}
struct Date{
    int y;
    int m;
    int d;
    void nextDay(){
        d++;
        if(d>mon[m][isdual(y)]){
            m++;
            d=1;
        }
        if(m>12){
            y++;
            m=1;
        }
        cnt++;
    }
}days;
int pos[5000][13][32];
int main(){
    int year1,month1=1,day1=1,cur;
    scanf("%d %d",&year1,&cur);
    days.y=1;
    days.m=1;
    days.d=1;
    while(days.y<3001){
        pos[days.y][days.m][days.d]=cnt;
        days.nextDay();
    }
    for(int i=1;i<=cur;i++){
        if((pos[year1][month1][day1]-pos[year1][1][1]+1)==cur)break;
        day1++;
        if(day1>mon[month1][isdual(year1)]){
            month1++;
            day1=1;
        }
        if(month1>12){
            year1++;
            month1=1;
        }
    }
    printf("%4d-%02d-%02d\n",year1,month1,day1);
    return 0;
}

3.Hash

KY136 统计同成绩学生人数

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int lst[101];

int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int tmp;
        scanf("%d",&tmp);
        lst[tmp]++;
    }
    int cur;
    scanf("%d",&cur);
    printf("%d\n",lst[cur]);
    return 0;
}

Sort

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

KY29 谁是你的潜在朋友

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int lst[201];
int pos[201];

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        int tmp;
        scanf("%d",&tmp);
        lst[tmp]++;
        pos[i]=tmp;
    }
    for(int i=0;i<n;i++){
        if(lst[pos[i]]==1){
            printf("BeiJu\n");
        }else{
            printf("%d\n",lst[pos[i]]-1);
        }
    }
    return 0;
}

KY25 剩下的树

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
bool tree[10010];
int main(){
    int l,m,num;
    scanf("%d%d",&l,&m);
    for(int i=0;i<m;i++){
        int st,ed;
        scanf("%d %d",&st,&ed);
        for(int j=st;j<=ed;j++){
            tree[j]=true;
        }
    }
    for(int i=0;i<=l;i++){
        if(tree[i]==false)num++;
    }
    printf("%d\n",num);
    return 0;
}

4.排版

KY58 Repeater

5.查找

KY158 找x

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
bool lst[1000010];
int pos[1000010];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int tmp;
        scanf("%d",&tmp);
        lst[tmp]=true;
        pos[tmp]=i;
    }
    int m;
    scanf("%d",&m);
    if(lst[m]==false){
        printf("-1\n");
    }else{
        printf("%d\n",pos[m]);
    }
    return 0;
}

better:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int buf[200];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&buf[i]);
    }
    int m,ans=-1;
    scanf("%d",&m);
    for(int i=0;i<n;i++){
        if(m==buf[i]){
        	ans=i;
        	break;
        }
    }
    printf("%d\n",ans);
    return 0;
}

★KY27 查找学生信息

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct info{
    char id[5];
    char name[10];
    char sex[5];
    int age;
}stu[1010];
bool cmp(info a,info b){
    return strcmp(a.id,b.id)<0;
}
int main(){
    int n,m;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s %s %s %d",&stu[i].id,&stu[i].name,
              &stu[i].sex,&stu[i].age);
    }
    sort(stu,stu+n,cmp);
    
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        char cur[5];
        scanf("%s",cur);
        int st=0,ed=n-1,flag=-1;
        while(ed>=st){
            int mid=(st+ed)/2;
            if(strcmp(cur,stu[mid].id)>0){
                st=mid+1;
            }else if(strcmp(cur,stu[mid].id)<0){
                ed=mid-1;
            }else if(strcmp(cur,stu[mid].id)==0){
                flag=mid;
                break;
            }
        }
        if(flag!=-1){
            printf("%s %s %s %d\n",stu[flag].id,stu[flag].name,
                       stu[flag].sex,stu[flag].age);
        }else{
            printf("No Answer!\n");
        }
    }
    return 0;
}

KY54 打印极值点下标

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int lst[100];
int pos[100];

int main(){
    int k;
    scanf("%d",&k);
    for(int i=0;i<k;i++){
        scanf("%d",&lst[i]);
    }
    int cur=0;
    for(int i=0;i<k;i++){
        if((i==0&&lst[0]!=lst[1])||(i==k-1&&lst[k-2]!=lst[k-1])){
            pos[cur++]=i;
        }else if(lst[i]>lst[i+1]&&lst[i]>lst[i-1]){
            pos[cur++]=i;
        }else if(lst[i]<lst[i+1]&&lst[i]<lst[i-1]){
            pos[cur++]=i;
        }
    }
    for(int i=0;i<cur-1;i++){
        printf("%d ",pos[i]);
    }
    printf("%d",pos[cur-1]);
    return 0;
}

★KY199 查找

在这里插入图片描述

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int lst[110];
int pos[110];

int main(){
    int n,m;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&lst[i]);
    }
    sort(lst,lst+n);
    
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        int st=0,ed=n-1,flag=-1,x;
        scanf("%d",&x);
        while(ed>=st){
            int mid=(st+ed)/2;
            if(x<lst[mid])ed=mid-1;
            else if(x>lst[mid])st=mid+1;
            else{
                flag=1;
                break;
            }
        }
        if(flag!=-1)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

6.贪心

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

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct goods{
    double j;
    double f;
    double s;
}buf[1000];
bool cmp(goods a,goods b){
    return a.s>b.s;
}
int main(){
    int n;double m;
    scanf("%lf %d",&m,&n);
    for(int i=0;i<n;i++){
        scanf("%lf %lf",&buf[i].j,&buf[i].f);
        buf[i].s=buf[i].j/buf[i].f;
    }
    sort(buf,buf+n,cmp);
    double weight=0;
    for(int i=0;i<n;i++){
        if(m>=buf[i].f){
            m-=buf[i].f;
            weight+=buf[i].j;
        }else{
            weight+=buf[i].s*m;
        }
    }
    printf("%.3lf\n",weight);
}

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

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct timeline{
    int st;
    int ed;
}buf[1000];
bool cmp(timeline a,timeline b){
    return a.ed<b.ed;
}
int main(){
    int n,num=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d %d",&buf[i].st,&buf[i].ed);
    }
    sort(buf,buf+n,cmp);
    int start=0;
    for(int i=0;i<n;i++){
        if(buf[i].st>=start){
            num++;
            start=buf[i].ed;
        }
    }
    printf("%d\n",num);
}

KY4 代理服务器

在这里插入图片描述
在这里插入图片描述
按照访问服务器的顺序,找到最远的那个和代理服务器ip相同的服务器,让计数器++。

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
char proxy[1000][18], server[5000][18];

int main(){
    int n,m;
    while(scanf("%d",&n)!=EOF){
        for(int i = 0; i < n; i++){
            scanf("%s", proxy[i]);
        }
        scanf("%d", &m);
        for(int i = 0; i < m; i++){
            scanf("%s", server[i]);
        }
        int index=0,flag=-1,count=-1;
        while(index<m){
            int max=0,cur;
            for(int i=0;i<n;i++){
                cur=index;
                while(strcmp(proxy[i],server[cur])&&cur<m)cur++;
                if(cur-index>max)max=cur-index;
            }
            count++;
            index+=max;
            if(max==0)break;
            else flag=1;
        }
        if(flag==-1){
            printf("-1\n");
        }else{
            printf("%d\n",count);
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值