0%

问题描述
  平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
  输入仅包含两行,每行描述一个矩形。
  在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
  输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00

思路:
(1)如果两个矩形相交,
在这里插入图片描述
如图,可以发现,我们只要求出两个矩形相交的主对角线的交点坐标,然后计算面积即可。观察图可以发现,A点横坐标是两个矩形两个小的横坐标的最大值,而B点横坐标是两个矩形两个大的横坐标的最小值,纵坐标类似,就可以求出矩形的长和宽了。
(2)若两个矩形不相交,上面的方法就不行了,通过计算得到的交点坐标如下图,很明显是不对滴,所以需要另行判断
在这里插入图片描述
AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
double max(double a,double b){
if(a>b)
return a;
else
return b;
}
double min(double a,double b){
if(a<b)
return a;
else
return b;
}
int main(){
double x1,x2,x3,x4,y1,y2,y3,y4,s;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
scanf("%lf%lf%lf%lf",&x3,&y3,&x4,&y4);
double m1,n1,m2,n2;//两个交点的坐标
if(max(x1,x2)<=min(x3,x4) || max(x3,x4)<=min(x1,x2))
printf("0.00\n");
else{
m1=max(min(x1,x2),min(x3,x4));
m2=min(max(x1,x2),max(x3,x4));
n1=min(max(y1,y2),max(y3,y4));
n2=max(min(y1,y2),min(y3,y4));
s=(m2-m1)*(n1-n2);
printf("%.2lf\n",s);
}
return 0;
}

Problem Description
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。

阅读全文 »

问题描述
  最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
  不妨设
  An=sin(1–sin(2+sin(3–sin(4+…sin(n))…)
  Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
  FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
输入格式
  仅有一个数:N<201。
输出格式
  请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1

仔细观察An和Sn,是有规律的,用代码实现出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
void An(int n){
int i;
for(i=1;i<=n;i++){
printf("sin(%d",i);
if(i%2!=0 && i!=n)
printf("-");
if(i%2==0 && i!=n)
printf("+");
}
for(i=0;i<n;i++)
printf(")");
}

void Sn(int n){
int i,d;
d=n;
for(i=0;i<n-1;i++)
printf("(");
for(i=1;i<=n;i++){
An(i);
printf("+%d",d);
if(d!=1)
printf(")");
d--;
}
}

int main(){
int n;
scanf("%d",&n);
Sn(n);
return 0;
}

题目描述:

有n个小朋友做游戏,他们的编号分别是1,2,3…n。他们按照编号从小到大依次顺时针围成一个圆圈,第一个小朋友从1开始报数,依次按照顺时针方向报数(报数的值加一),每个报m的人会离开队伍,然后下一个小朋友会继续从1开始报数,直到只剩下一个小朋友为止。

求最后一位小朋友的编号。

阅读全文 »

Description

小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。
其标价都是4位数字(即千元不等)。
小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了(参见图片)。

阅读全文 »

Description

大数学家高斯有个好习惯:无论如何都要记日记。

他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210

后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

高斯出生于:1777年4月30日。

在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。

高斯获得博士学位的那天日记上标着:8113

请你算出高斯获得博士学位的年月日。

注意:只提交这个日期,不要输出其它附加内容,比如:说明性的文字。

阅读全文 »

问题描述
  给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
  例如:
  3 1 2 4
  4 3 6
  7 9
  16
  现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。
输入格式
  第1行为两个正整数n,sum
输出格式
  一个1~N的一个排列
样例输入
4 16
样例输出
3 1 2 4
数据规模和约定
  0<n<=10

思路

一看 n<=10那直接暴力了。
使用vector容器,借助C++中next_permutation()函数,升序列举出所有的全排列序列,然后循环对每个序列都操作并判断,如果找到,就break即可。
这里一次操作其实就是把1~n-1下标的元素,依次加上它后面的元素,这个操作重复n-1次即可,最后判断数组下标0和结果sum是否相等即可。

用到的函数:
next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。
这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>
使用方法:next_permutation(数组头地址,数组尾地址);若下一个排列存在,则返回真,如果不存在则返回假。

百度解释:
boolean next_permutation(a.begin(),a.end())
该函数是以输入字符串中的字符所构建的按字典顺序全排列中,判断当前字符串之后是否还有下一个字符串。如果next_permutation的执行次数少于全排列的个数,返回true。

例如 a=”abc” 全排列有 “abc” “acb” “bac” “bca” “cab” “cba”
执行一次next_permutation 返回true a变成 “acb”
再执行一次next_permutation 返回true a变成 “bac”

当执行到a=”cba” 时 由于这已经是全排列的最后一个字符串,所以 再次执行next_permutation 则返回false

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n,sum,i,j,sum1=0;
cin>>n>>sum;
vector<int> a(n);
for(int i=0;i<n;i++)
a[i]=i+1;
do{
vector<int> b=a;//将数组a复制给b
for(int i=0;i<n-1;i++)
for(int j=0;j<n-i-1;j++)
b[j]+=b[j+1];//b[0]=b[0]+b[1],b[1]=b[1]+b[2]...
if(b[0]==sum){
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
break;
}
}while(next_permutation(a.begin(),a.end()));//产生下一个排列,循环即进行全排列
return 0;
}