课程中涉及的题目

1.水仙花数”是指一个三位正整数,它各位数字的立方之和等于它本身。例如,153就是一个“水仙花数”,因为153=13+53+33。请给出输出所有水仙花数的算法。

2.给出求1-1/2+1/3-1/4+…+1/19-1/20的算法。

3.按照阶从高到低对以下函数排序:

答案:

 

课堂练习的题目:

1.装箱问题(简单)

Problem Description:

一个工厂生产的产品形状都是长方体,高度都是h,主要有1*1,2*2,3*3,4*4,5*5,6*6等6种。这些产品在邮寄时被包装在一个6*6*h的长方体包裹中。由于邮费很贵,工厂希望减小每个订单的包裹数量以增加他们的利润。因此他们需要一个好的程序帮他们解决这个问题。你的任务就是设计这个程序。

Input:

输入包括多组测试数据,每一行代表一个订单。每个订单里的一行包括六个整数,用空格隔开,从小到大分别为这6种产品的数量。6个0表示文件结束。

Output:

针对每个订单输出一个整数,占一行,代表对应的订单所需的最小包裹数。没有多余的空行。

Sample Input:

0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0

Sample Output:

2
1

代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
//6*6一个,5*5一个+11个1*1
//4*4一个+5个2*2;
//3*3四个
int main()
{
    int a,b,c,d,e,f,N;//N存放盒子个数
     while(~scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f))
    {
        if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)
            break;
        int u[4]={0,5,3,1};
        N=d+e+f+(c+3)/4;
        int y=d*5+u[c%4];
        if(b>y) N+=ceil(b-y+8)/9;
        //计算1*1的
        int x=N*36-b*4-c*9-d*16-e*25-f*36;
        if(a>x) N+=(a-x+35)/36;
        printf("%d\n",N);
    }
    return 0;
 }

2.整数区间

Problem Description:

一个整数区间[a,b](a < b),是一个从a到b连续整数的集合。
现在给你n个整数区间,编程找出一个集合R,使得n个集合中的每个集合都有2个整数出现在R中,并且这个集合R包含的整数个数最少。

Input:

第一行包含整数n(1 <= n <= 10000),表示整数区间的个数。接下来n行,每行包含两个整数a和b(0 <= a < b <= 10000, a < b)。

Output:

输出符合条件的集合R中元素的个数。

Sample Input:

4
3 6
2 4
0 2
4 7

Sample Output:

4

代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct s
{
    int l,r;
};

bool vv(const s &a,const s &b)
{
    return a.r < b.r;
}
int main()
{
    int n;
    cin>>n;
    vector <s> v(n);
    for (int i = 0; i < n;i++)
    {
        cin>>v[i].l>>v[i].r;
    }
    vector <int> aim;
    sort(v.begin(),v.end(),vv);
    for (int i = 0; i < n;i++)
    {
        int num = 0;
        bool flag = 0;
        for (int j = v[i].l; j <= v[i].r;j++)
        {
            if (find(aim.begin(),aim.end(),j) != aim.end())
            {
                num++;
                if ( *find(aim.begin(),aim.end(),j) == v[i].r)
                flag =1;
            }
        }
        if (num == 0)
        {
            aim.push_back(v[i].r);
            aim.push_back(v[i].r-1);
        }
        else if (num == 1 && flag ==0)
        {
            aim.push_back(v[i].r);
        }
        else if (num == 1 &&flag ==1)
            aim.push_back(v[i].r-1);
    }
    cout<<aim.size()<<endl;
    return 0;
}

3.安装雷达

Problem Description

我们假设海岸线是一条无限直线:以海岸线为界,陆地和海洋被分开,在海边分布着很多小岛。现在,我们在海岸线上安装雷达,每个雷达有固定的通讯范围(以d为半径的圆形区域),这样,海边的小岛就可以被某个雷达信号覆盖。
这里我们使用笛卡尔坐标系,定义海岸线为x轴,x轴上方是海洋,下方是陆地。给出分布在海边每个小岛的坐标位置和雷达信号能覆盖的范围d,你的任务是计算出最小需要安装的雷达数目,使得这些雷达信号能覆盖到所有海边的小岛。每个小岛的坐标格式为(x,y)。
如下图所示,给出第一个输入样例的坐标表示,这样在(-2,0),(1,0)上分别安装雷达就可以覆盖所有的小岛(p点),所以我们只需要安装2个雷达。

Input

输入包含多组测试样例。每组测试第一行包含两个整数n(1<=n<=1000)和d,n表示小岛的数目,d表示雷达能覆盖的范围的半径。接下来n行,每行由整数x和y组成,表示n个小岛的坐标位置。每两组数据之间有一个空行。
输入0 0表示输入的结束。

Output

对于每一组输入,按照输出样例中的格式输出:包含输出序号和最少需要安装雷达的数目。如果找不到解决方案,即不能找到一种安装方案覆盖所有的小岛,输出”-1”。

Sample Input

3 2
1 2
-3 1
2 1

1 2
0 2

0 0

Sample Output

Case 1: 2
Case 2: 1

代码:

#include<stdio.h>
#include<algorithm>
#include<math.h>

using namespace std;

struct Node
{
    double l,r;
}arr[1123];
int cmp(struct Node a,struct Node b)
{
    return a.l<b.l;
}
int main()
{
    int n,m;
    int x=1;
    while(~scanf("%d%d",&n,&m) && (m+n))
    {
        int a,b;
        int flag=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            arr[i].l=a-sqrt(m*m-b*b);
            arr[i].r=a+sqrt(m*m-b*b);
            if(b>m || m<=0 || b<0)
                flag=1;
        }
        if(flag)
        {
            printf("Case %d: -1\n",x++);
            continue;
        }
        sort(arr,arr+n,cmp);
        double xxx=arr[0].r;
        int count=1;
        for(int i=1;i<n;i++)
        {
            if(arr[i].l>xxx)
            {
                count++;
                xxx=arr[i].r;
            }
            else if(arr[i].r<xxx)
                xxx=arr[i].r;
        }
        printf("Case %d: %d\n",x++,count);
    }
    return 0;
}

4.最长上升子序列

Problem Description

一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... <iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

Input

输入有很多组,每组输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。

Output

输出每组的最长上升子序列的长度。

Sample Input

7
1 7 3 5 9 4 8
6
2 3 4 1 6 5

Sample Output

4
4

最长上升子序列的参考博客:https://www.cnblogs.com/frankchenfu/p/7107019.html

代码:

#include<cstdio>
const int MAX=1001;
int a[MAX];
int lis(int x)
{
    int num[MAX];
    for(int i=0;i<x;i++)
    {
        num[i]=1;
        for(int j=0;j<i;j++)
        {
            if(a[j]<a[i]&&num[j]+1>num[i])
                   num[i]=num[j]+1;
        }
    }
    int maxx=0;
    for(int i=0;i<x;i++)
        if(maxx<num[i])
            maxx=num[i];
    return maxx;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    return !printf("%d\n",lis(n));
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值