深度优先

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

0%

【算法】2016年第四届湘潭大学新生趣味程序设计竞赛-Java

Age

原题链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1253

Age

题目描述

今年是2016年,一个年龄小于99岁(出生当年为0岁)的人,把出生年份的前两位和后两位相加得到一个整数n。你能根据n,算出他有多少岁吗?

输入

第一行输入一个整数T(1≤T≤99),表示样例的个数。 每行输入一个整数n。

输出

每行输出一个样例的结果。

样例输入

1
2 20 118 

样例输出

1
16 17 

样例解释

第1样例,此人生于2000年;第2样例,此人生于1999年。

代码:

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

public class Age {

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];

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

for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}

private static int getAge(int nextInt) {
for (int i = 1918; i <= 2016; i++) {
if((i/100+i%100)==nextInt)
return 2016-i;
}
return 0;
}
}

Balance

Balance

题目描述

小明有一架天平,小明想称出1∼n克的物品,请问最少需要几颗砝码?
比如小明想称出1∼4克的物品,需要2颗砝码,为1和3克。

balance

输入

第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例,为一个整数 (1≤n≤109)。

输出

每行输出一个样例的结果。

样例输入

1
3 1 4 40 

样例输出

1
1 2 4 

代码:

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

public class Balance {

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i]=getBalance(sc.nextInt());
}

for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}

private static int getBalance(int nextInt) {
int sum=1;
for (int i = 1; i < 32; i++) {
if(nextInt<=sum)
return i;
else
{
sum+=Math.pow(3, i);
}
}
return 0;
}
}
1
2
3
4
5
6
ClockClock题目描述钟的一圈是12小时,其中时针、分钟都是匀速移动。一天从00:00~23:59,请问某一时刻,时针与分针的夹角是多少?输入第一行是一个整数T(1≤T≤1440),表示样例的个数。 以后每行是一个时刻,格式为HH:MM。输出每行输出一个样例的结果,如果结果不是整数,小数部分不要输出多余的0。样例输入2
00:01
00:30

## []()样例输出

5.5 165

1
2

代码:
1

import java.util.Scanner;

public class Clock {

public static void main(String[] args) {

    Scanner sc=new Scanner(System.in);
    int n=Integer.parseInt(sc.nextLine());
    String[] arr=new String[n];

    for (int i = 0; i < arr.length; i++) {
        arr[i]=getClock(sc.nextLine());
    }

    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
}

private static String getClock(String nextLine) {
    String[] arr=nextLine.split(":");
    double h=Integer.parseInt(arr[0]);
    double m=Integer.parseInt(arr[1]);
    if(h>=12)
        h=h-12;
    double hf=h/12*360+m/60*30;
    double mf=m/60*360;
    double t=Math.abs(hf-mf);
    if(t>=180)
        t=360-t;
    if(t==180)
        t=0;
    String str=""+t;
    if(str.endsWith(".0"))
        str=str.substring(0,str.length()-2);
    return str;
}

}

1
2
  

Different Digits
Different Digits题目描述有一个n位数x,每个数码都不一样,可你知道x的后m(m<n)位构成的整数x′,请问满足条件最小的x是多少?输入第一行是一个整数T(1≤T≤1000),表示样例的个数。 每个样例一行,为两个整数n(2≤n≤10)和x的后m位的整数x′(0≤x′<987654321,x′没有前导0且所有数码都不一样)。输出每行输出一个样例的结果。样例输入2
3 12
4 12

样例输出

1
312 3012

代码: ```
import java.util.Scanner;

public class DifferentDigits {

public static void main(String[] args) {

    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    String[] arr=new String[n];

    for (int i = 0; i < arr.length; i++) {
        int a=sc.nextInt();
        int b=sc.nextInt();
        arr[i]=getDigits(a,b);
    }

    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
}
private static String getDigits(int a, int b) {
    String str=b+"";
    while (str.length()!=a) {
        for (int i = 0; i < 10; i++) {
            if(str.indexOf(i+"")==-1){
                if(a-str.length()==1&&i==0)
                    continue;
                str=i+str;
                break;
            }
        }
    }
    return str;
}

}

1
2
3
  


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

## Estrella's Travel

# []()Estrella's Travel


## []()题目描述

Estrella喜欢旅行,她准备去自己心仪的城市看风景。她精心选择了一条线路,准备自驾游。自驾线路是一条链路,上有n+1座城市,编号依次为0∼n,Estrella住在0号城市,目的地是n号城市。Estrella为了环保,驾驶了一辆纯电动车,所以最多只能一次行驶m个城市的距离。如果Estrella在某个城市(包括n号城市)停留,自然会需要一些费用,当然每个城市的花费是不一样,Estrella想知道,这个花费最小是多少?


## []()输入

多组数据输入。
每组数据第一行两个整数n(1<n<1000),m(1≤m<n)。
第二行n个整数ai(0<ai≤1000),表示编号为1,2,⋯,n的城市的停留花费。


## []()输出

对于每个数据,输出一行,表示总的花费。


## []()样例输入

5 2 1 2 3 4 5 6 2 6 5 4 3 2 1

1
2
3
4


## []()样例输出

9 9

1
2
3
4
5
6
7
8


## []()样例解释

第1个样例,依次到城市1,3,5,所以花费为1+3+5=9;
第2个样例,依次到城市2,4,6,所以花费为5+3+1=9。

代码:

import java.util.Scanner;

public class EstrellasTravel {
public static void main(String[] args) {
Scanner sa=new Scanner(System.in);
while(true){
int n=sa.nextInt();
int m=sa.nextInt();
int a[]=new int[n];
for (int i = 0; i < a.length; i++) {
a[i]=sa.nextInt();
}
getEstrellas(n,m,a);
}
}
private static void getEstrellas(int n, int m, int[] a) {
int dp[]=new int[100000];
dp[0]=0;
for (int i = 1; i <= n; i++) {
int min=dp[i-1];
for (int j =Math.max(i-m, 0); j < i; j++) {
min=Math.min(min, dp[j]);
}
dp[i]=min+a[i-1];
}
System.out.println(dp[n]);
}
}

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

## Finally,Which light is on?

# []()Finally, which light is on?


## []()题目描述

有n盏灯,编号1~n。一开始灯都是关着的,每个灯有一个开关,按奇数次为打开,按偶数次为关闭。我们先把编号为1的倍数的灯按一下开关,再把编号为2的倍数的灯按一下开关,依次下去,一直到把编号为n的倍数灯按一下,请问最后有多少盏灯是亮的?

![lamp](http://blog.csdn.net/blesslzh0108/article/details/53746656)



## []()输入

第一行是一个整数T(1≤T≤10000),表示样例的个数。 以后的每行一个样例,为一个整数n(1≤n≤109)。


## []()输出

每行输出一个样例的结果。


## []()样例输入

2 1 5

1
2
3
4


## []()样例输出

1 2

1
2
3
4
5
6
7


## []()样例解释

第2个样例,先把1~5都打开;然后把2,4关掉;然后把3关掉;然后把4打开;然后把5关掉;所以,最后剩1和4是亮着的。

代码:

import java.util.Scanner;

public class Finally {

public static void main(String[] args) {

    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();

    int[] arr=new int[n];
    for (int i = 0; i < arr.length; i++) {
        arr[i]=getPFS(sc.nextInt());
    }
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
}

private static int getPFS(int nextInt) {
    int conut=0;
    for (int i = 1; i <= nextInt; i++) {
        if((Math.pow(i, 0.5)+"").endsWith(".0"))
            conut++;
    }
    return conut;
}

}

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


## Gemstone Bracelet

# []()Gemstone Bracelet


## []()题目描述

mumuchacha是一个爱美的小姑娘,她有一条漂亮的宝石手链,宝石手链上有N个不同的宝石,每一颗宝石都有它特定的魅力值。

mumuchacha每天都把手链戴在手上,她很喜欢抬起手来看她的手链,但是每次都只能看到一部分(M个宝石),因为还有一部分被手臂挡住了,所以她不断的旋转手链,每次转动一颗宝石,使每次看到的宝石都不同,求mumuchacha每次旋转后看到的宝石魅力值之和的最大值。


## []()输入

有多个样例,输入的第一行是样例个数T
每个样例的第一行是两个整数n和m,(1≤m≤n≤100000)。
第二行是n个整数ai,表示n个宝石的魅力值(1≤ai≤10000)


## []()输出

每行输出一个整数,即魅力值和的最大值


# []()样例输入

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

1
2
3
4


# []()样例输出

12 26

1

代码:

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

public class Gemstone {

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for (int i = 0; i < arr.length; i++) {
int le=sc.nextInt();
int k=sc.nextInt();
int[] data=new int[le];
for (int j = 0; j < data.length; j++) {
data[j]=sc.nextInt();
}
arr[i]=getMax(k,data);
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}

private static int getMax(int k, int[] data) {
int sum=0;
int temp=0;
int co=0;
int x=0;
for (int i = 0; i < data.length; i++) {
while (co!=k) {
x=co+i;
if(x>=data.length){
x=x-data.length;
}
temp+=data[x];
co++;
}
sum=temp>sum?temp:sum;
co=0;
temp=0;
}
return sum;
}
}

```