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));
}