复习题(1)

问题 A: yangftc的时间安排

题目描述
yangftc需要安排他的时间,有很多事情做,每个事情都有固定的开始和结束时间,因为yangftc每次只能做一件事情,如果有两个或者多个事情的时间重合了那么他就会说 NO,否则他就会说 YES 。
输入
第一个数字t代表样例数量,
后面t个样例,每个样例输入一个n表示事情的数量,后面n行每行两个数字l r表示这个事情的开始和结束时间;
输出
判断yangftc会说什么 YES或者 NO 。
数据范围 1<=t<=500 1<=n<=100 1<=l<=r<=100000
样例输入 Copy
2
3
1 3
4 5
6 7
2
1 3
3 4
样例输出 Copy
YES
NO

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct Activity{
int s;
int f;};
int cmp(Activity &a,Activity &b){
return a.s<=b.s;}//开始时间升序排序,也可以按结束时间
int main()
{
    int t;//实例个数
    while(cin>>t){


        while(t--){
            int n;//事情件数
            cin>>n;
            Activity a[n];
            for(int i=0;i<n;i++){
                cin>>a[i].s;
                cin>>a[i].f;
            }
            sort(a,a+n,cmp);
            int flag=0;
            for(int i=0;i<n;i++){
                for(int j=i+1;j<n;j++){
                    if(a[i].f>=a[j].s){flag=1;break;}
                }
            }
            if(!flag){ cout<<"YES"<<endl;}
            else{ cout<<"NO"<<endl;}
        }

    }

    return 0;
}

自守数

题目描述
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n以内的自守数的个数。
输入
int型整数。
输出
n以内自守数的数量。
样例输入 Copy
2000
样例输出 Copy
8

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int fun(int i){
    long long int x=(long long int)i*i;//注意这里是关键
    while(i>0){
        if(x%10==i%10){
            x/=10;
            i/=10;
        }
        else{return 0;break;}
    }
    return 1;

}
int main()
{
    int n;
    while(~scanf("%d",&n)){
        int sum=0;
        for(int i=0;i<=n;i++){
              //int p=pow(i,2);
              //int w=weishu(i);
              //int t=(int)pow((double)10,(double)w);
             //printf("%d\n",p);
            if(fun(i)==1){sum++; }
        }
        printf("%d\n",sum);
    }
    return 0;
}

相聚HNUCM校园食堂

题目描述
HNUCM的食堂重新装修了,小明决定约上朋友去食堂相聚,在食堂里,小明看到了M位男同学,N位女同学,小明是一个颜值控,因此他对每一位男生和女生都有一个颜值打分,他心里yy着想为这些单身狗们进行配对,小明真是一个关心同学的人!但小明认为配对同学的颜值之差不能超过5,注意必须是一位男同学和一位女同学才能配对,虽然小明对于可以配对的人数已经有了答案,但他想考考你的编程能力,因此他想请你帮他用编程算一下最多可以配对多少个人。(本题介绍仅作题目背景使用,无任何其他观点)
输入
每个测试文件仅有一条测试数据。
第一行输入M,N,分别表示男同学的数量,女同学的数量。(1<=M<=100,1<=N<=100)
第二行输入M个正整数,分别表示男同学们的颜值。
第三行输入N个正整数,分别表示女同学们的颜值。
注意,所有人的颜值分数范围在[1,100]
输出
输出最多可以配对的总人数。
样例输入 Copy
5 4
10 65 23 67 80
5 15 60 90
样例输出 Copy
4
提示
样例中第一位男同学和第一位女同学配对,第二位男同学和第三位女同学配对。

#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
    return a<b;
}

int main()
{
    int M,N;
    while(cin>>M>>N){
        int a[M];
        int a1[M];
        int c=0;
        memset(a1,0,sizeof(a1));//初始化
        int b[N];
        int b1[N];
        memset(b1,0,sizeof(b1));//初始化
        for(int i=0;i<M;i++){
            cin>>a[i];
        }
        for(int i=0;i<N;i++){
            cin>>b[i];
        }
    sort(a,a+M,cmp);//一定要排序
    sort(b,b+N,cmp);
        for(int i=0;i<M;i++){

            for(int j=0;j<N;j++){
                if(abs(a[i]-b[j])<=5&&!a1[i]&&!b1[j]){
                    a1[i]=1;b1[j]=1;c++;
                }
            }
        }

        cout<<c*2<<endl;
    }
    return 0;
}

问题 F: 简单递归求和

题目描述
使用递归编写一个程序求如下表达式前n项的计算结果: (n<=100)
1 - 3 + 5 - 7 + 9 - 11 +…
输入n,输出表达式的计算结果。
输入
多组输入,每组输入一个n,n<=100。
输出
输出表达式的计算结果。
样例输入 Copy
1
2
样例输出 Copy
1
-2

#include <stdio.h>
#include <stdlib.h>
int fun(int n){
if(n==1){return 1;}
if(n%2==0){return fun(n-1)-(2*n-1);}
if(n%2!=0){return fun(n-1)+(2*n-1);}
}
int main()
{
    int n;
    while(~scanf("%d",&n)){
        int p=fun(n);
        printf("%d\n",p);
    }
    return 0;
}

问题 H: 递归求和

使用递归编写一个程序求如下表达式的计算结果: (1<n<=20)
S(n) = 14 + 49 + 916 + 1625 + … + ((n-1)2)*n2
输入n,输出表达式S(n)的结果。
输入
单组输入,输入一个正整数n,1<n<=20。
输出
输出表达式S(n)的计算结果。
样例输入 Copy
3
样例输出 Copy
40

#include <stdio.h>
#include <stdlib.h>
int fun(int n){
if(n==1){return 0;}
return fun(n-1)+(n-1)*(n-1)*n*n;
}
int main()
{
    int n;
    while(~scanf("%d",&n)){
        int p=fun(n);
        printf("%d\n",p);
    }
    return 0;
}

问题 G: 文件存储

题目描述
如果有n个文件{F1,F2,F3,…,Fn}需要存放在大小为M的U盘中,文件i的大小为Si,1<=i<=n。请设计一个算法来提供一个存储方案,使得U盘中存储的文件数量最多。
输入
多组输入,对于每组测试数据,每1行的第1个数字表示U盘的容量M(以MB为单位,不超过256*1000MB),第2个数字表示待存储的文件个数n。
第2行表示待存储的n个文件的大小(以MB为单位)。
输出
输出最多可以存放的文件个数。
样例输入 Copy
10000 5
2000 1000 5000 3000 4000
样例输出 Copy
4

#include<bits/stdc++.h>

using namespace std;

int main()
{
   int M,n;
   while(cin>>M>>n){
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    int c=0;
    for(int i=0;i<n;i++){
        if(a[i]<=M){
            c++;
            M-=a[i];
        }
    }
    cout<<c<<endl;
   }
    return 0;
}

问题 I: 最大收益(部分背包)

题目描述
小X是一位精明的投资人,他每次都能够做出正确的投资判断。
现在有N个项目,每个项目的总投资额和总收益已知,并且每一个项目都允许小X只投资一部分,当然也就只能拿到一部分收益。
现在小X决定拿出M万元钱来进行投资,请你帮他设计一个算法来计算最大收益和。
输入
单组输入,对于每一组数据,第1行包含两个正整数,分别是M和N,其中M<=10^6,N<=100。
接下来N行每行均包含两个正数(不一定是正整数),第1数字表示第N个项目的总投资额(万元),第2个数字表示第N个项目的总收益(万元),两个数字之间用空格隔开。
输出
小X可以获得的最大收益和(万元,结果四舍五入保留两位小数)。
样例输入 Copy
100 4
50 10
20 10
40 10
50 20
样例输出 Copy
37.50

#include<bits/stdc++.h>

using namespace std;
struct TOU{
double w;
double v;
double vw;};
TOU t[105];
int cmp(TOU &a,TOU &b){
return a.vw>b.vw;}
int main()
{
    double M;
   int N;
   while(cin>>M>>N){
    for(int i=0;i<N;i++){
        cin>>t[i].w>>t[i].v;
        t[i].vw=t[i].v/t[i].w;
    }
    sort(t,t+N,cmp);
    double value=0;
    int i=0;
        while(t[i].w<=M&&i<N){

            M-=t[i].w;
            value+=t[i].v;
            i++;

        }
         if(i<N){
            value+=M*t[i].vw;
        }
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<value<<endl;
   }
    return 0;
}

问题 J: 排列蛋卷

题目描述
刚考完研的TC同学这段时间在家闲得慌,因此他决定学点新手艺。今天他学习的内容是:做蛋卷。
由于是第一次做蛋卷,TC同学做出来蛋卷长短不一。看着这些长度都不一样的蛋卷,TC同学的强迫症又犯了。他希望能够拿出其中部分蛋卷,使得留下来的蛋卷能够按照长度从大到小的次序排列。
请问他最少需要拿出多少根蛋卷?
输入
单组输入,对于每一组测试数据,第1行N表示蛋卷的总数量(n<=1000)。
第2行包含N个正整数,分别表示每一根蛋卷的长度。(单位:厘米)
保证在同一组输入数据中每一根蛋卷的长度均不一样。
输出
输出最少需要拿出的蛋卷数量。
样例输入 Copy
5
15 18 17 11 12
样例输出 Copy
2

#include <iostream>

using namespace std;

int main()
{
   int n;
   while(cin>>n){
    int a[n+1];
     int b[n+1];
     for(int i=1;i<=n;i++){
        cin>>a[i];
     }
     b[1]=1;
     for(int i=2;i<=n;i++){
        int maxx=0;
        for(int j=i-1;j>0;j--){
            if(a[j]>a[i]&&b[j]>maxx){
                maxx=b[j];
            }
        }
        b[i]=maxx+1;
     }
     int maxx2=b[1];
     for(int i=2;i<=n;i++){
        if(b[i]>maxx2){maxx2=b[i];}
     }
     int p=n-maxx2;
     cout<<p<<endl;
   }
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值