河南理工大學程式設計(ACM)大賽解題報告

Main-zy發表於2013-12-09

數值統計

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 73   Accepted Submission(s) : 56

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

統計給定的n個數中,負數、零和正數的個數。

Input

輸入資料有多組,每組佔一行,每行的第一個數是整數n(n<100),表示需要統計的數值的個數,
然後是n個實數;如果n=0,則表示輸入結束,該行不做處理。

Output

對於每組輸入資料,輸出一行a,b和c,分別表示給定的資料中負數、零和正數的個數。

Sample Input

6 0 1 2 3 -1 0
5 1 2 3 4 0.5
0 

Sample Output

1 2 3
0 0 5

Author

lcy

Source

C語言程式設計練習(二)

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		while(input.hasNext()){
			int n=input.nextInt();
			if(n==0)
				break;
			int a=0,b=0,c=0;
			while(n-->0){
				float s=input.nextFloat();
				if(s==0)
					b++;
				if(s<0)
					a++;
				if(s>0)
					c++;
			}
			System.out.println(a+" "+b+" "+c);
		}
	}
}

數塔

Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 55   Accepted Submission(s) : 33

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的:

有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?

已經告訴你了,這是個DP的題目,你能AC嗎?

Input

輸入資料首先包括一個整數C,表示測試例項的個數,每個測試例項的第一行是一個整數N(1 <= N <= 100),
表示數塔的高度,接下來用N行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間[0,99]內。

Output

對於每個測試例項,輸出可能得到的最大和,每個例項的輸出佔一行。

Sample Input

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

Sample Output

30

Source

2006/1/15 ACM程式設計期末考試

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
	//	Scanner input=new Scanner(System.in);
		//BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		Scanner input=new Scanner(System.in);
		int N=input.nextInt();
		while(N-->0){
			int c=input.nextInt();
			int a[][]=new int[c][c];
			a[0][0]=input.nextInt();
			for(int i=1;i<c;i++){
				for(int j=0;j<=i;j++){
					a[i][j]=input.nextInt();
				}
			}
			for(int i=1;i<c;i++){
				a[i][0]+=a[i-1][0];
				for(int j=1;j<i;j++){
					a[i][j]+=a[i-1][j-1]>a[i-1][j]?a[i-1][j-1]:a[i-1][j];
				}
				a[i][i]+=a[i-1][i-1];
			}
			int sum=a[c-1][0];
			for(int i=1;i<c;i++){
				if(sum<a[c-1][i]){
					sum=a[c-1][i];
				}
			}
			System.out.println(sum);
			/*for(int i=0;i<c;i++){
				for(int j=0;j<=i;j++){
					System.out.print(a[i][j]+" ");
				}
				System.out.println();
			}*/
		}
	}
}

蟠桃記

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 75   Accepted Submission(s) : 54

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

喜歡西遊記的同學肯定都知道悟空偷吃蟠桃的故事,你們一定都覺得這猴子太鬧騰了,其實你們是有所不知:悟空是在研究一個數學問題!
什麼問題?他研究的問題是蟠桃一共有多少個!
不過,到最後,他還是沒能解決這個難題,呵呵^-^
當時的情況是這樣的:
第一天悟空吃掉桃子總數一半多一個,第二天又將剩下的桃子吃掉一半多一個,以後每天吃掉前一天剩下的一半多一個,
到第n天準備吃的時候只剩下一個桃子。聰明的你,請幫悟空算一下,他第一天開始吃的時候桃子一共有多少個呢?

Input

輸入資料有多組,每組佔一行,包含一個正整數n(1<n<30),表示只剩下一個桃子的時候是在第n天發生的。

Output

對於每組輸入資料,輸出第一天開始吃的時候桃子的總數,每個測試例項佔一行。

Sample Input

2
4

Sample Output

4
22

Author

lcy

Source

C語言程式設計練習(二)


import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		while(input.hasNext()){
			int n=input.nextInt();
			long sum=1;
			for(int i=1;i<n;i++){
				sum=(sum+1)*2;
			}
			System.out.println(sum);
		}
	}
}


七夕節

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 171   Accepted Submission(s) : 39

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

七夕節那天,月老來到數字王國,他在城門上貼了一張告示,並且和數字王國的人們說:
"你們想知道你們的另一半是誰嗎?那就按照告示上的方法去找吧!"
人們紛紛來到告示前,都想知道誰才是自己的另一半.告示如下:



數字N的因子就是所有比N小又能被N整除的所有正整數,如12的因子有1,2,3,4,6.
你想知道你的另一半嗎?

Input

輸入資料的第一行是一個數字T(1<=T<=500000),它表明測試資料的組數.然後是T組測試資料,
每組測試資料只有一個數字N(1<=N<=500000).

Output

對於每組測試資料,請輸出一個代表輸入資料N的另一半的編號.

Sample Input

3
2
10
20

Sample Output

1
8
22

Author

Ignatius.L

Source

杭電ACM省賽集訓隊選拔賽之熱身賽
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
	public static void main(String[] args) {
	//	Scanner input=new Scanner(System.in);
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		try {
			int N=Integer.parseInt(bf.readLine());
			while(N-->0){
				int n=Integer.parseInt(bf.readLine());
				long sum=1;
				int i=0;
				for(i=2;i*i<=n;i++){
					if(n%i==0){
						sum+=i+n/i;
					}
				}
				if((i-1)*(i-1)==n)
					sum-=Math.sqrt(n);
				System.out.println(sum);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}

六度分離

Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 36   Accepted Submission(s) : 9

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

1967年,美國著名的社會學家斯坦利·米爾格蘭姆提出了一個名為“小世界現象(small world phenomenon)”
的著名假說,大意是說,任何2個素不相識的人中間最多隻隔著6個人,即只用6個人就可以將他們聯絡在一起
因此他的理論也被稱為“六度分離”理論(six degrees of separation)。雖然米爾格蘭姆的理論屢屢應驗,
一直也有很多社會學家對其興趣濃厚,但是在30多年的時間裡,它從來就沒有得到過嚴謹的證明,
只是一種帶有傳奇色彩的假說而已。 

Lele對這個理論相當有興趣,於是,他在HDU裡對N個人展開了調查。他已經得到了他們之間的相識關係,
現在就請你幫他驗證一下“六度分離”是否成立吧。

Input

本題目包含多組測試,請處理到檔案結束。
對於每組測試,第一行包含兩個整數N,M(0<N<100,0<M<200),分別代表HDU裡的人數
(這些人分別編成0~N-1號),以及他們之間的關係。
接下來有M行,每行兩個整數A,B(0<=A,B<N)表示HDU裡編號為A和編號B的人互相認識。
除了這M組關係,其他任意兩人之間均不相識。

Output

對於每組測試,如果資料符合“六度分離”理論就在一行裡輸出"Yes",否則輸出"No"。

Sample Input

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

Sample Output

Yes
Yes

Author

linle

Source

2008杭電集訓隊選拔賽——熱身賽

/*
 * 相當於求最短路徑是否小於等於7
 * 
 */
import java.util.Arrays;
import java.util.Scanner;
public class Main{
	static int Max=100000;
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		while(input.hasNext()){
			int n=input.nextInt();
			int m=input.nextInt();
			int map[][]=new int[n][n];
			for(int i=0;i<n;i++){
				Arrays.fill(map[i], Max);
				map[i][i]=0;
			}
			for(int i=0;i<m;i++){
				int a=input.nextInt();
				int b=input.nextInt();
				map[a][b]=map[b][a]=1;
			}
			for(int k=0;k<n;k++){
				for(int i=0;i<n;i++){
					for(int j=0;j<n;j++){
						if(map[j][i]>map[j][k]+map[k][i])
							map[j][i]=map[j][k]+map[k][i];
					}
				}
			}
			int min=0;
			for(int i=0;i<n;i++){
				for(int j=0;j<i;j++){
					if(min<map[i][j])
						min=map[i][j];
				}
			}
			if(min<=7)
				System.out.println("Yes");
			else
				System.out.println("No");
		}
	}
}


相關文章