oj

潜规则

  • 输出后不留空格,下可留换行

经典算法

Minecraft

描述

Minecraft是一个几乎无所不能的沙盒游戏,玩家可以利用游戏内的各种资源进行创造,搭建自己的世界。
在Minecraft中,基本的建筑元素是边长为1个单位的立方体,Tony想用N个这种小立方体搭建一个长方体,并用他珍藏已久的贴纸对其进行装饰。如果一张贴纸可以贴满小立方体的一个面。那么,他需要用掉多少张贴纸呢?

输入

一个整数N,表示小明所拥有的小立方体的个数。N不会超过1000。

输出

一个整数,即小明最少用掉的贴纸有多少张。

输入样例

1
9

输出样例

1
30

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <climits>
using namespace std;
int main(){
int min=INT_MAX;
int n;
cin>>n;
for(int i=1;i<n;i++){
for(int j=1;j<n;j++){
if(n%(i*j)==0){
int k=n/(i*j),s;
s=2*(i*j+i*k+j*k);
if(s<min)
min=s;
}
}
}
cout<<min<<endl;
return 0;
}

线段相交

描述

每个线段是用平面上的两个点来描述,用结构体实现对于任意输入的2个线段,判断其是否相交。
提示:两点(x1,y1), (x2,y2) 间直线斜率是k=(y2-y1)/(x2-x1).

输入

判断次数和2条线段的x1、y1、x2、y2

输出

是否相交

输入样例

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

输出样例

1
2
3
disjoint
intersect
disjoint

参考代码

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<iostream>
using namespace std;
struct point{
int x1,y1,x2,y2;
double k;
double b;
};
int main(){
int t;
cin>>t;
while(t--){
point point1,point2;
cin>>point1.x1>>point1.y1>>point1.x2>>point1.y2;
cin>>point2.x1>>point2.y1>>point2.x2>>point2.y2;
point1.k=float(point1.y2-point1.y1)/float(point1.x2-point1.x1);
point2.k=float(point2.y2-point2.y1)/float(point2.x2-point2.x1);
point1.b=point1.y1-point1.k*point1.x1;
point2.b=point2.y1-point2.k*point2.x1;
double y1,y2,y3,y4;
y1=point1.k*point2.x1+point1.b-point2.y1;
y2=point1.k*point2.x2+point1.b-point2.y2;
y3=point2.k*point1.x1+point2.b-point1.y1;
y4=point2.k*point1.x2+point2.b-point1.y2;
if(y1*y2<=0 && y3*y4<=0)
cout<<"intersect"<<endl;
else
cout<<"disjoint"<<endl;
}
return 0;
}

判断矩形是否重叠

描述

用具有x,y两个整型变量成员的结构类型SPoint来表示坐标点。用SRect结构类型来描述矩形,其中包含p1和p2两个SPoint成员分别表示矩形对角线上的两个点。
编写判断两个矩形是否重叠的函数。

输入

判断次数
矩形1的对角线顶点坐标x1、y1、x2、y2
矩形2的对角线顶点坐标x1、y1、x2、y2
……

输出

是否重叠

输入样例

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

输出样例

1
2
3
not overlapped
overlapped
overlapped

参考代码

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
35
36
37
38
39
40
#include<iostream>
using namespace std;
struct SPoint{
int x1,y1,x2,y2;
};
int main(){
int t;
cin>>t;
while(t--){
SPoint p1,p2;
int t;
cin>>p1.x1>>p1.y1>>p1.x2>>p1.y2;
cin>>p2.x1>>p2.y1>>p2.x2>>p2.y2;
if(p1.x2<p1.x1){
t=p1.x1;
p1.x1=p1.x2;
p1.x2=t;
}
if(p1.y2>p1.y1){
t=p1.y1;
p1.y1=p1.y2;
p1.y2=t;
}
if(p2.x2<p2.x1){
t=p2.x1;
p2.x1=p2.x2;
p2.x2=t;
}
if(p2.y2>p2.y1){
t=p2.y1;
p2.y1=p2.y2;
p2.y2=t;
}
if(p1.y2>p2.y1 || p1.y1<p2.y2 || p1.x2<p2.x1 || p1.x1>p2.x2)
cout<<"not overlapped"<<endl;
else
cout<<"overlapped"<<endl;
}
return 0;
}

病人排队

描述

病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
老年人(年龄 >= 60岁)比非老年人优先看病。
老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
非老年人按登记的先后顺序看病。

输入

第1行,输入一个小于100的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病>人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格>隔开。

输出

按排好的看病顺序输出病人的ID,每行一个。

输入样例

1
2
3
4
5
6
5
021075 40
004003 15
010158 67
021033 75
102012 30

输出样例

1
2
3
4
5
021033
010158
021075
004003
102012

参考代码

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
35
36
37
38
39
40
41
42
43
#include <iostream>
using namespace std;
struct message{
string id;
int age{};
};
int main(){
int n;
cin>>n;
auto *p=new message[n];
int x=0,y=0;
message old[100];
message young[100];
for(int i=0;i<n;i++){
cin>>p[i].id>>p[i].age;
if(p[i].age>=60){
old[x]=p[i];
x++;
}
else{
young[y]=p[i];
y++;
}
}
//冒泡排序,不可用选择排序
for(int i=0;i<x-1;i++){
for(int j=0;j<x-1-i;j++){
if(old[j+1].age>old[j].age){
message t=old[j];
old[j]=old[j+1];
old[j+1]=t;
}
}
}
for(int i=0;i<x;i++){
cout<<old[i].id<<endl;
}
for(int i=0;i<y;i++){
cout<<young[i].id<<endl;
}
delete []p;
return 0;
}
Reward
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • © 2019-2020 Bingoyyj
  • Powered by Hexo Theme Ayer
  • PV: UV:

什么?这次一定?

支付宝
微信