2017年10月17日 星期二

ITSA第58次月賽 Problem 3. 完整二元樹

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=38906

import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
Scanner scn =new Scanner(System.in);
int t=Integer.parseInt(scn.nextLine());
while(t--!=0) {
int n=Integer.parseInt(scn.nextLine()),index=1,x=0,b=0;
StringTokenizer tokens = new StringTokenizer(scn.nextLine(),"(),");
int arr[]=new int [tokens.countTokens()/2];
while(tokens.hasMoreTokens()) {
if(index%2==0)
arr[x++]=Integer.parseInt(tokens.nextToken());
else
tokens.nextToken();
index++;
}
for(int i=1;i<=Math.ceil(arr.length/2);i++){
if(Math.abs(arr[i-1]-arr[2*i-1])<=n) {
if(b!=0)
System.out.print(" ");
System.out.printf("%c%c",i+64,i*2+64);
b=1;
}
if(Math.abs(arr[i-1]-arr[2*i])<=n) {
if(b!=0)
System.out.print(" ");
System.out.printf("%c%c",i+64,i*2+65);
b=1;
}
}
System.out.println();
}
}
/*題目:ITSA第58次月賽 Problem 3. 完整二元樹
作者:1010
時間:西元 2017 年10 月 */
}
這題不要看到是樹就想得很害怕又複雜,其實他一點跟樹的演算法都無關仔細看看可以發現規律並用簡單數學就能推出答案囉!


ITSA第58次月賽 Problem 2. 道路修補

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=38905

import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scn =new Scanner(System.in);
int n=scn.nextInt();
while(n--!=0) {
int t=scn.nextInt(),max=0,tot=0;
Set<Integer> set = new HashSet<Integer>();
for(int i=0;i<t;i++) {
int x=scn.nextInt(),y=scn.nextInt();
for(int j=x+1;j<=y;j++) {
set.add(j);
}
}
System.out.println(set.size());
}
}
/*題目:ITSA第58次月賽 Problem 2. 道路修補
作者:1010
時間:西元 2017 年10 月 */
}

這題有兩種做法第一種最直覺建立長度10000的陣列把需要修補的道路依序塞入數值,另外找出裡面數值最大的數最後算修補的道路就從0~amx就好囉
第二種方法就是利用java中的set容器囉,他會自動地把重複數字砍掉最後算set的總長度就是答案囉!

ITSA第58次月賽 Problem 1. 計算正整數被3整除之數值之總和

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=38904

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn =new Scanner(System.in);
int n=scn.nextInt();
while(n--!=0) {
int num=scn.nextInt(),tot=0;
for(int i=1;i<=num/3;i++) {
tot+=3*i;
}
System.out.println(tot);
}
}
/*題目:ITSA第58次月賽 Problem 1. 計算正整數被3整除之數值之總和
作者:1010
時間:西元 2017 年10 月 */
}

這題可以用模擬的方式單迴圈每次+3依序把整除數相加就是答案了

2017年10月9日 星期一

ITSA 第57次月賽 Problem 1. QWERTY

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=38004

import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
int n=Integer.parseInt(scn.nextLine());
while(n--!=0) {
String s[]=scn.nextLine().split(" ");
int arr[]=new int [Integer.parseInt(s[0])],tot=0,num=0,pre=0;
for(int i=0;i<arr.length;i++)
arr[i]=Integer.parseInt(s[i+1]);
Arrays.sort(arr);
for(int i=0;i<arr.length;i++) {
num+=pre;
tot+=num;
pre=arr[i];
}
System.out.println(tot);
}
}
/*題目:Problem 5. The Job Scheduling Problem
作者:1010
時間:西元 2017 年10 月 */
}

這題鍵盤還包含標點符號

ITSA 第57次月賽 Problem 5. The Job Scheduling Problem

http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?id=38008

import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
int n=Integer.parseInt(scn.nextLine());
while(n--!=0) {
String s[]=scn.nextLine().split(" ");
int arr[]=new int [Integer.parseInt(s[0])],tot=0,num=0,pre=0;
for(int i=0;i<arr.length;i++)
arr[i]=Integer.parseInt(s[i+1]);
Arrays.sort(arr);
for(int i=0;i<arr.length;i++) {
num+=pre;
tot+=num;
pre=arr[i];
}
System.out.println(tot);
}
}
/*題目:Problem 5. The Job Scheduling Problem
作者:1010
時間:西元 2017 年10 月 */
}

這題要先暸解Shortest jop first(sjf)
意思是花費最小的工作時間先執行
所以這題必須要排序,之後陣列走訪依序加上等待時間

2017年10月8日 星期日

Q263: Number Chains

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=199

import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
while(true) {
int n=scn.nextInt(),tot=0,count=1;
if(n==0)
break;
String arr[]=Integer.toString(n).split(""),x="",y="";
Set<Integer> set = new HashSet<Integer>();
System.out.println("Original number was "+n);
Z:
while(true) {
Arrays.sort(arr);
x="";y="";
for(int i=0;i<arr.length;i++) {
y+=arr[i];
x+=arr[arr.length-1-i];
}
tot=Integer.parseInt(x)-Integer.parseInt(y);
for(int i:set) {
if(tot==i) {
System.out.println(Integer.parseInt(x)+ " - " + Integer.parseInt(y) +" = "+tot);
System.out.println("Chain length "+count);
System.out.println();
break Z;
}
}
System.out.println(Integer.parseInt(x)+ " - " + Integer.parseInt(y) +" = "+tot);
arr=Integer.toString(tot).split("");
count++;
set.add(tot);
}
}
}
/*題目:Q263: Number Chains
作者:1010
時間:西元 2017 年10 月 */
}

這題就把該字串由大到小剪掉小到大的數串得出的解看是否有重複
ex: 12345
54321-12345=41976
這裡要注意輸出有01234要把頭的0去掉
為了避免TL這邊我用set來儲存不重複的數值