源于《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;
}