深度优先

这个家伙好懒,除了文章什么都没留下

0%

阶乘之和

时间限制:3000 ms | 内存限制:65535 KB

难度:3

描述

给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;

输入

第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;

输出

如果符合条件,输出Yes,否则输出No;

样例输入

1
2910

样例输出

1
YesNo

赶大的取就是的,数据范围也不大,可以先将阶乘打表

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
import java.util.Scanner;

public class T5阶乘之和 {

static int[] arr=new int[]{1,2,6,24,120,720,5040,40320,362880};
public static void main(String[] args) {

Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
String[] out=new String[n];

for (int i = 0; i < out.length; i++) {
out[i]=farr(sc.nextInt());
}

for (int i = 0; i < out.length; i++) {
System.out.println(out[i]);
}
}
}
private static String farr(int num) {

for (int i = arr.length-1; i >= 0; i--) {
if(num>=arr[i]){
num=num-arr[i];
}
}
if(num==0)
return "Yes";
return "No";
}
}

独木舟上的旅行

时间限制:3000 ms | 内存限制:65535 KB

难度:2

描述

进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅客的最少的独木舟条数。现在请写一个程序,读入独木舟的最大承载量、旅客数目和每位旅客的重量。根据给出的规则,计算要安置所有旅客必须的最少的独木舟条数,并输出结果。

输入

第一行输入s,表示测试数据的组数;
每组数据的第一行包括两个整数w,n,80<=w<=200,1<=n<=300,w为一条独木舟的最大承载量,n为人数;
接下来的一组数据为每个人的重量(不能大于船的承载量);

输出

每组人数所需要的最少独木舟的条数。

样例输入

1
385 65 84 85 80 84 8390 390 45 60100 550 50 90 40 60

样例输出

1
533

这题比较简单。

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
import java.util.Arrays;
import java.util.Scanner;

public class T4独木舟上的旅行 {

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int[] out=new int[n];

for (int i = 0; i < out.length; i++) {
int max=sc.nextInt();
int p=sc.nextInt();
double[] data=new double[p];
for (int j = 0; j < data.length; j++) {
data[j]=sc.nextDouble();
}
Arrays.sort(data);

int count=data.length;
for (int j = 0; j < data.length; j++) {
for (int k = data.length-1; k >= 0; k--) {
if(data[j]!=-1&&data[k]!=-1&&j!=k)
if(data[j]+data[k]<=max){
count--;
data[j]=data[k]=-1;
break;
}
}
}
out[i]=count;
}
for (int i = 0; i < out.length; i++) {
System.out.println(out[i]);
}
}
}
}

喷水装置(二)

时间限制:3000 ms | 内存限制:65535 KB

难度:4

描述

有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。

输入

第一行输入一个正整数N表示共有n次测试数据。
每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。

输出

每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
如果不存在一种能够把整个草坪湿润的方案,请输出0。

样例输入

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

样例输出

1
2
1
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import java.util.Scanner;

public class T3喷水装置2 {

static int w,h,ans;

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int[] out=new int[n];

for (int i = 0; i < out.length; i++) {
int t=sc.nextInt();
w=sc.nextInt();
h=sc.nextInt();
double[][] data=new double[t][2];
for (int j = 0; j < data.length; j++) {
data[j][0]=sc.nextDouble();
data[j][1]=sc.nextDouble();
}
out[i]=getNum(data,w,h);
}
for (int i = 0; i < out.length; i++) {
System.out.println(out[i]);
}
}
}

private static int getNum(double[][] data, int w, int h) {

data=getSort(data);
double x=0,l=0,r=w;
ans=1;

if(data[0][1]*2<h) return 0;

x=Math.pow(data[0][1]*data[0][1]-(h/2)*(h/2),0.5);
r=data[0][0]-x;
l=data[0][0]+x;

while(l<w||r>0){
if(l<w){
l=getl(l,data);
ans++;
}
if(r>0){
r=getr(r,data);
ans++;
}
if(ans>data.length) return 0;
}
return ans;
}

//向右移动
private static double getl(double l, double[][] data) {

double max=0;
for (int i = 0; i < data.length; i++) {
if(data[i][1]*2>h){
double d=Math.pow(data[i][1]*data[i][1]-(h/2)*(h/2),0.5);
if(l<data[i][0]+d){
if(max<data[i][0]+d){
max=data[i][0]+d;
}
}
}
}
return max;
}

//向右移动
private static double getr(double r, double[][] data) {

double min=r;
for (int i = 0; i < data.length; i++) {
if(data[i][1]*2>h){
double d=Math.pow(data[i][1]*data[i][1]-(h/2)*(h/2),0.5);
if(r>data[i][0]-d){
if(min>data[i][0]-d){
min=data[i][0]-d;
}
}
}
}
return min;
}

private static double[][] getSort(double[][] data) {

for (int i = 0; i < data.length; i++) {
for (int j = i+1; j < data.length; j++) {
if(data[i][1]<data[j][1]){

double t1=data[i][0];
data[i][0]=data[j][0];
data[j][0]=t1;

double t2=data[i][1];
data[i][1]=data[j][1];
data[j][1]=t2;
}
}
}
return data;
}
}