Showing posts with label Java Project [ACM]. Show all posts
Showing posts with label Java Project [ACM]. Show all posts
[JAVA] Inception Watch step by step
Aagkasit Tontan
วันนี้เราจะมาทำโจทย์ Inception Watch แบบ step by step
โจทย์ Inception Watch สามารถดาวโหลดได้ที่ลิงค์ http://goo.gl/48Zvudจากบทความเดิมที่ผมเคยเขียนไว้ ACM InceptionWatchQ JAVA วิธีทำ คือ ให้คำนวณกลับจากชั้นสุดท้ายมายังชั้นแรก ในชั้นสุดท้าย (level n) จะคำนวณเวลาของ Tsk ที่ชั้นนั้นได้โดยตรง ส่วนชั้น n-1 ต้องเอาเวลาทั้งหมด(elapsed time) ของชั้น n หารด้วย 12 แล้วบวกกับ Tnext ของชั้นนั้น ก็จะได้ Tsk ของชั้น n-1
อ่านแล้วคงรู้งงๆมาลองคำนวน เพื่อจะช่วยให้เห็นภาพมากขึ้น ซึ่งมองภาพการเขียนโปรแกรมของเราได้ชัดเจนมากยิ่งขึ้นด้วย
1.การวิเคราะห์โจทย์และลองคำนวณผลลัพธ์ด้วยมือก่อนเขียนโปรแกรม
1.1 แปลงเวลาทั้งหมดให้เป็นหน่วยวินาทีทั้งหมดของทุกๆชั้น
โดยอ้างอิงจากโจทย์ตัวอย่างต่อไปนี้
1 48 m
2 6 h
3 2 d
4 24 d
-1
หน่วยเวลาทีควรรู้นะครับ
1 นาที(m) = 60 วินาที
1 ชั่วโมง(h) = 3600 วินาที ->ได้จาก 60*60
1 วัน(d) = 86400 วินาที ->ได้จาก 24*60*60
1 ปี(y) = 31536000 วินาที ->ได้จาก 365*24*60*60
ผลจากการแปลงให้อยู่ในหน่วย วินาที ก็จะได้ตัวเลขดังนี้
0 0
1 2880
2 21600
3 172800
4 2073600
1.2 การคำนวน inception watch โดยใช้สูตร
sum = sum / 12 +incept[i - 1].getNumSecond();
โดยกำหนดให้
sum คือ ตัวแปรสำหรับเก็บผลลัพธ์
Incept[i - 1].getNum() คือ จำนวนเวลาในหน่วยวินาที ในชั้นรองจากชั้นปัจจุบันที่เราอยู่
i คือ ชั้นปัจจุบันที่เราอยู่
getNumSecond () คือ เป็นฟังก์ชันก์สำหรับการดึงจำนวนเวลาในหน่วยวินาทีของชั้น i -1
Incept คือ เป็น object ที่เก็บลำดับชั้นจำนวนเวลาในวินาที
วิธีทำ
เริ่มจากชั้นที่ 5ค่า ณ ปัจจุบัน sum = 0 , Incept[i - 1].getNum() = 2073600, i = 5
แทนค่า sum = 0/ 12 + 2073600
sum = 2073600;
ชั้นที่ 4
ค่า ณ ปัจจุบัน sum = 2073600 , Incept[i - 1].getNum() = 172800 , i = 4
แทนค่า sum = 2073600 / 12 + 172800
sum = 345600
ชั้นที่ 3
ค่า ณ ปัจจุบัน sum = 345600 , Incept[i - 1].getNum() = 21600 , i = 3
แทนค่า sum = 345600 / 12 + 21600
sum = 50400
ชั้นที่ 2
ค่า ณ ปัจจุบัน sum = 50400 , Incept[i - 1].getNum() = 2880 , i = 2
แทนค่า sum = 50400 / 12 + 2880
sum = 7080
ชั้นที่ 1
ค่า ณ ปัจจุบัน sum = 7080 , Incept[i - 1].getNum() = 0 , i = 1
แทนค่า sum = 7080 / 12 + 0
sum = 590
เป็นอันเสร็จการคำนวน แล้วเราจะมาแสดงค่ายังไงล่ะ เราก็เรียงจากด้านล่างไปด้านหน้าก็จบ
590
7080
50400
345600
2073600
ส่วนการทำให้ได้ตัวเลขแสดง 10 หลักอ่านลงไปด้านล่างของบทความก็จะเจอครับ
16:09:00
Java Project [ACM]
[Java] ACM CommonPermutationQ
Aagkasit Tontan
The Problem
Given two strings a and b, print the longest string x of letters such that there is apermutation of x that is a subsequence of a and there is a permutation of x that is a
subsequence of b.
Sanple Input / Output
source code
import java.util.Scanner;
import java.util.Arrays;
/**
*
* @author http://www.javaagkasit.blogspot.com/
*/
public class CommonPermutation {
int[] d = new int[1000];
static String strtemp;
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
CommonPermutation cp = new CommonPermutation();
while (true) {
String[] a = (sc.nextLine()).split("");
String[] b = (sc.nextLine()).split("");
if (a.length <= 1000 | b.length <= 1000) {
int c = 0;
char[] out = new char[a.length];
for (int i = 1; i < a.length; i++) {
for (int j = 1; j < b.length; j++) {
if (cp.check(j) == false) { //not in store index
if (a[i].equals(b[j])) { //if chalacter
s1[i] == s2[j]
out[c++] = b[j].charAt(0);//then store output
cp.store(j); //then store index
break; //then stop Search
}
} else {
continue;
}
}
}
cp.printout(out, c);//print output
cp.clearArr(); //clear arrays store index
System.out.println();
}
}
}
public boolean check(int i) {
boolean c = true;
int m = Arrays.binarySearch(d, i);
if (m < 0) {
c = false;
}
return c;
}
public void printout(char[] s, int c) {
char[] ans = new char[c];
for (int i = 0; i < ans.length; i++) {
ans[i] = s[i];
}
Arrays.sort(ans);
System.out.print(ans);
}
public void store(int p) {
int c = 0;
d[c++] = p;
Arrays.sort(d);
}
public void clearArr() {
for (int i = 0; i < d.length; i++) {
d[i] = 0;
}
}
}
Download source code here !!!
10:29:00
Java Project [ACM]
[JAVA] ACM Reverse and Add
Aagkasit Tontan
The Problem
เป็นการนำตัวเลขมาสลับ(Reverse)แล้วบวกกับค่าเดิม และกระทำเช่นนั้นไปเรื่อยๆจนกว่าผลลัพธ์จะเป็น palindrome ก็คือตัวเลขที่เรียงจากซ้ายไปขวา เรียงขวาไปซ้ายเป็นเลขเดียวกัน สังเกตุจากรูปด้านล่าง ผลลัพธ์ 9339 เรียงซ้ายไปขวา เรียงขวาไปซ้าย ก็ ได้ตัวเลขเดียวกัน
Sample input / output
I have a Java code.
import java.util.Scanner;
/**
* @author http://javaagkasit.blogspot.com/
*/
public class ReverseAndAdd {
static long MAX = (long) 4294967295.0;//ค่ามากสุด
private String sum ; // เช่น 195
private long sumba; //ถ้า sum เป็น 195 ,sumba ก็จะเป็น 951
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
ReverseAndAdd rev = new ReverseAndAdd();
long sum2 = 0 ,re ; //re ไว้ตัวเลขที่กลับตำแหน่งแล้ว
String sum = ""; //เก็บตัวเลขที่อ่านมาจากไฟล์
try{
do{
sum = input.nextLine(); //อ่านข้อมูลมาที่ละบรรทัด
int count = 0;
while(true){//ทำไปเรื่อย
sum2 = Long.parseLong(sum);
re = rev.Reverse(sum);
if(sum2 == re)
break;//ออกจากการวนลูป (เจอ)
else if((count == 1000)|(sum2 > MAX)) {
System.out.println("not palindrome foun");
break; //ออกจากการวนลูป(ไม่เจอ)
}else {//เก็บผลลัพธ์ล่าสุด
sum = rev.ans(sum2, re);
count++;
}
}
rev.print(count, sum2,sum);//โชว์คำตอบออกทาง output
}while(!"0".equals(sum));
}catch(Exception e){
e.getMessage();
System.out.println("Input errors.!!!\nTry put, 195 ");
}
}
// เมทอต สำหรับสลับตำแหน่งตัวเลข เช่น 159 ก็จะสลับเป็น 951
public long Reverse(String sum){
StringBuffer sb = new StringBuffer(sum);
sb.reverse();
sumba = Long.parseLong(sb.toString());
return sumba;
}
//เอา sum + sumba
public String ans(long sum,long sumba){
sum += sumba; //sum = sum +sumba
String an = String.valueOf(sum);
return an;
}
//ปริ๊นคำตอบออก output
public void print(int count,long sum,String sums){
if((count == 1000)|(sum >= MAX)|(sums.equals("0")))
;
else
System.out.println(count+" "+sum);
}
}
21:55:00
Java Project [ACM]
[JAVA] ACM PrimaryArthmeticQ
Aagkasit Tontan
Sample Input
| 123 456 555 555 123 594 0 0 |
Sample Output
No carry operation. 3 carry operations.
1 carry operation.
|
I have a java code.
| /** * * @author http://javaagkasit.blogspot.com/ */ import java.util.Scanner; public class PrimaryArthmeticQ { static int ten =10,zero = 0,one =1; private int ans = zero, carry = zero, totalcarry = zero; public static void main(String[] args)throws Exception{ Scanner sc = new Scanner(System.in); PrimaryArthmeticQ PAQ =new PrimaryArthmeticQ(); try{ while(true){ String inputS= sc.nextLine(); if(!inputS.equals("0 0")){ String[] input =inputS.split(" "); PAQ.process(input[zero], input[one]); PAQ.print(); }else{ System.out.print(""); break; } } }catch(Exception e){ System.out.println(e.getClass()); System.out.println("Re-enter.!!!"); } } public void process(String s1,String s2){ String ss1 = reverseStr(s1);//ตัวตั่ง String ss2 = reverseStr(s2);//ต้วบวก int last = lengthLoop(ss1,ss2);//จำหลักของตัวเลข int op=zero,op2=zero; for(int i =zero ; i < last ;i++){ if( i < ss1.length()) op = Integer.parseInt(ss1.charAt(i)+"");else op = zero; if( i < ss2.length()) op2 = Integer.parseInt(ss2.charAt(i)+"");else op2 = zero; add(op,op2);//ตัวตั่งกับ ต้วบวกบวกกัน } this.carry = zero;//clear carry =0 } public void print(){ if(totalcarry == one) System.out.println(totalcarry+" "+"carry operation."); else if(totalcarry == zero) System.out.println("No carry operation."); else System.out.println(totalcarry+" "+"carry operations."); this.totalcarry = zero;//clear totalcarry =0 } private void add(int op,int op2){ ans = op + op2 +carry; Ccarray(); } private void Ccarray(){ if(ans >= ten){ this.carry = one; totalcarry++; }else this.carry = zero; } private String reverseStr(String st){ StringBuffer str = new StringBuffer(st); str.reverse(); String ss = str.toString(); return ss; } private int lengthLoop(String s1,String s2){ int last=zero; if(s1.length() > s2.length()){ last=s1.length(); }else{ last=s2.length(); } return last; } } |
01:55:00
Java Project [ACM]
[Java basic] การใช้ if else if
Aagkasit Tontan
ตัวอย่าง การใช้งาน if else if
| /** * * @author http://javaagkasit.blogspot.com/ */ public class ifelseif { public static void main(String [] args){ int score = 60; if(score <= 49){ System.out.println("gate F"); }else if (score <= 59 ){ System.out.println("gate D"); }else if(score <= 69){ System.out.println("gate C"); }else if(score <= 79){ System.out.println("gate B"); }else if(score <= 100){ System.out.println("gate A"); }else{ System.out.println("enter score"); } } } |
output
01:21:00
Java Project [ACM]
อธิบายโค้ดอย่างละเอียด MinimumSwapQ JAVA
Aagkasit Tontan
อธิบายโค้ดอย่างละเอียด MinimumSwapQ JAVA
ลำดับขั้นตอนการเขียน
- รับค่าข้อมูลทางคีร์บอร์ดแล้วนำค่ามาแปลง Character พร้อมกับจัดเก็บข้อมูลใส่ Array
- เก็บข้อมูลใส่ Array ได้แล้ว จากนั้นก็ ทำการเรียงข้อมูลจากน้อยไปมาก
- ซึ่งในขั้นตอนที่ 2 เราต้อง มีตัว Counter ไว้นับจำนวนครั้งที่สลับที่ของข้อมูล - พอวนรอบจนครับก็แสดงค่าผลลัทธ์ออก Output
import java.util.Scanner; /** * @author http://javaagkasit.blogspot.com/ */ public class MinimumSwapQ { private static int counter = 0;// ตัวแปร counter ไว้นับจำนวนครั้งที่สลับที่ของข้อมูล private static String input ; public static void main(String[] args){ Scanner sn =new Scanner(System.in); try{ while(!(input = sn.nextLine()).equals("000")){ char [] charecter = charArr(input); int current = 0, last = charecter.length-1; int walker, smallest; while(current < last) { smallest = current; walker = current + 1; //วนหาอักษรที่เล็กที่สุด ในข้อมูลที่เหลือ while(walker <= last) { if(charecter[smallest] > charecter[walker]) smallest = walker; walker++; }//เจอแล้วก็สลับตำแหน่งกัน swap(charecter, current, smallest); current++; } print();// แสดงจำนวนที่สลับ } }catch(Exception e){ System.out.println(e.getClass()); System.out.println("Re-enter.!!!"); } } //เอา input มาแปลงเป็น char และเก็บข้อใส่ array static char[] charArr(String input){ char [] charecter = new char[input.length()]; for(int i=0 ;i< input.length();i++){ charecter[i] = (char) input.codePointAt(i); } return charecter; } // เมทอดสำหรับ สำหรับ สลับตำแหน่ง static char[] swap(char[] arr, int current, int smallest) { if(arr[current] > arr[smallest]) counter++; char temp = arr[current]; arr[current] = arr[smallest]; arr[smallest] = temp; return arr; } // เมทอดสำหรับ สำหรับ แสดงผล output static void print(){ System.out.println(counter); counter = 0; } } |
การทำงานหลักๆของโปรแกรม
try{
while(!(input = sn.nextLine()).equals("000")){ //1. รับค่าข้อมูลทางคีร์บอร์ด char [] charecter = charArr(input);//1 แล้วนำค่ามาแปลง Character พร้อมกับจัดเก็บข้อมูลใส่ Array int current = 0, last = charecter.length-1; int walker, smallest; //2.เก็บข้อมูลใส่ Array ได้แล้ว จากนั้นก็ ทำการเรียงข้อมูลจากน้อยไปมาก while(current < last) { smallest = current; walker = current + 1; //วนหาอักษรที่เล็กที่สุด ในข้อมูลที่เหลือ while(walker <= last) { if(charecter[smallest] > charecter[walker]) smallest = walker; walker++; }//เจอแล้วก็สลับตำแหน่งกัน swap(charecter, current, smallest); current++; } // 3.พอวนรอบจนครับก็แสดงค่าผลลัทธ์ออก Output print(); } }catch(Exception e){ System.out.println(e.getClass()); System.out.println("Re-enter.!!!"); } } |
- รับค่าข้อมูลทางคีร์บอร์ดแล้วนำค่ามาแปลง Character พร้อมกับจัดเก็บข้อมูลใส่ Array
while(!(input = sn.nextLine()).equals("000")){ char [] charecter = charArr(input); |
char [] charecter = charArr(input); คือ การนำเอา input ที่เข้ามาแปลงเป็น Character พร้อมกับจัดเก็บข้อมูลใส่ Array ส่วน charArr() เป็นเมทอต สำหรับนำค่าแปลง input ให้เป็น Character แล้วก็ รีเทิน ค่า Character อาร์เรย์ กลับคืนมา คลิกเพื่อดูเมทอต charArr()
2. เก็บข้อมูลใส่ Array ได้แล้ว จากนั้นก็ ทำการเรียงข้อมูลจากน้อยไปมาก
- Counter ไว้นับจำนวนครั้งที่สลับที่ของข้อมูล คลิกเพื่่อดู
3. การแสดงผลลัทธ์ออก Output จะใช้ เมทอต print()
// เมทอดสำหรับ สำหรับ แสดงผล output
static void print(){ System.out.println(counter); counter = 0; //เคีล๋ยค่า couter ทุกครั้งที่มีการ print ผลลัพธ์ } |
ผมก็ขอจบแค่นี้ครับ ถ้าสงสัยก็ หรือ แนะนำ การเขียน บทความ ก็คอมเม้นสอบถาม - แนะนำได้ครับ
03:41:00
Java Project [ACM]
อัลกอริทึม MinimumSwapQ
Aagkasit Tontan
อัลกอริทึม MinimumSwapQ
วิธีที่ผมคิดในการเรียงข้อมูลให้สลับที่ได้น้อยครั้งที่สุด
รอบที่ 1 ตำแหน่งที่เลือกคือ index 0 (เลข 3) แล้วก็ให้ไปวนหาในข้อมูลในตำแหน่งที่เหลือคือ 1,2,3(เลข 4,2,1 ตามลำดับ) ปรากฎว่า ข้อมูลที่เล็กที่สุด คือ เลข 1 แล้วนำเลข 3 กับ 1 เปรียบเทียบกัน ปรากฎว่า เลข 1 เล็กว่า 3 นำเลข 3 กับ เลข 1 สลับตำแหน่งกัน (ถ้าข้อมูลที่ค้นหาเจอขนาดใหญ่กว่า ก็ไม่ต้องสลับตำแหน่งกัน) สลับตำแหน่งกันเรียบร้อยก็ เลื่อน ตำแหน่งที่เลือก ไปข้างหน้า 1 ตำแหน่ง และตำแหน่งที่เลือกคือ index 0 ก็จะกลายเป็น ตำแหน่งทีเรียงเสร็จแล้ว (ตำแหน่งทีเรียงเสร็จแล้วเราจะไม่ไปยุ่งกับมันอีก)
รอบที่ 2 ตำแหน่งที่เลือกคือ index 1 (เลข 4) แล้วก็ให้ไปวนหาในข้อมูลในตำแหน่งที่เหลือคือ 2,3(เลข 2,3 ตามลำดับ) ปรากฎว่า ข้อมูลที่เล็กที่สุด คือ เลข 2 แล้วนำเลข 4 กับ 2 เปรียบเทียบกัน ปรากฎว่า เลข 2 เล็กว่า 4 นำเลข 4 กับ เลข 2 สลับตำแหน่งกัน สลับตำแหน่งกันเรียบร้อยก็ เลื่อน ตำแหน่งที่เลือก ไปข้างหน้า 1 ตำแหน่ง และตำแหน่งที่เลือกคือ index 1 ก็จะกลายเป็น ตำแหน่งทีเรียงเสร็จแล้ว
รอบที่ 3 ตำแหน่งที่เลือกคือ index 2 (เลข 4) แล้วก็ให้ไปวนหาในข้อมูลในตำแหน่งที่เหลือคือ 3 (เลข 3 ตามลำดับ) ปรากฎว่า ข้อมูลที่เล็กที่สุด คือ เลข 3 แล้วนำเลข 4 กับ 3 เปรียบเทียบกัน ปรากฎว่า เลข 3 เล็กว่า 4 นำเลข 4 กับ เลข 3 สลับตำแหน่งกัน สลับตำแหน่งกันเรียบร้อยก็ เลื่อน ตำแหน่งที่เลือก ไปข้างหน้า 1 ตำแหน่ง และตำแหน่งที่เลือกคือ index 2 ก็จะกลายเป็น ตำแหน่งทีเรียงเสร็จแล้ว
รอบที่ 4 ตำแหน่งที่เลือกคือ index 3 (เลข 4) ก็จะไม่ต้องทำอะไร ก็เอาเลข 4 เป็นข้อมูลที่ใหญ่ที่สุดเลย
ก็เสร็จสิ้นการเรียงข้อมูล
จากแนวคิดผมก็นำมาเขียนโค้ด
char [] charecter = charArr(input);
int current = 0, last = charecter.length-1; int walker, smallest; // while(current < last) { smallest = current; walker = current + 1; //วนหาอักษรที่เล็กที่สุด ในข้อมูลที่เหลือ while(walker <= last) { if(charecter[smallest] > charecter[walker]) smallest = walker; walker++; }//เจอแล้วก็สลับตำแหน่งกัน swap(charecter, current, smallest);//คือ เมทอต ไว้สลับตำแหน่งข้อมูล current++; } } |
current คือ ตัวแปรทำหน้าที่ เก็บตำแหน่ง(index)ที่เราเลือก
last คือ ตัวแปรทำหน้าที่ เก็บตำแหน่ง(index)สุดท้ายของข้อมูล
wallker คือ ตัวแปรทำหน้าที่สำหรับ วนหาค่าที่เล็กที่สุดใน ข้อมูลที่เหลืออยู่
smallest คือ ตัวแปรทำหน้าที่เก็บตำแหน่งข้อมูลที่เล็กสุด
swap คือ เมทอต ไว้สลับตำแหน่งข้อมูล
สำหรับการ อธิบาย อัลกอริทึม MinimumSwapQ ตามแนวคิดผม ก็จบแค่นี้ ครับ ถ้าไม่เข้าใจ ส่วนไหน คอมเม้น ถามได้นะครับ เอาไว้เจอกันใน บทความต่อไปคับ
สำหรับการ อธิบาย อัลกอริทึม MinimumSwapQ ตามแนวคิดผม ก็จบแค่นี้ ครับ ถ้าไม่เข้าใจ ส่วนไหน คอมเม้น ถามได้นะครับ เอาไว้เจอกันใน บทความต่อไปคับ
03:16:00
Java Project [ACM]
เมทอต swap ใน MinimumSwapQ JAVA
Aagkasit Tontan
เมทอต swap ใน MinimumSwapQ JAVA
เป็น เมทอต ใช้สำหรับสลับตำแหน่ง ข้อมูลใน Array
// เมทอดสำหรับ สำหรับ สลับตำแหน่ง static char[] swap(char[] arr, int current, int smallest) { //จะมีการเปรียบเทียบก่อนว่าค่าที่ index current มีค่ามากกว่า index smallest ค่อยจะเพิ่มค่า counter if(arr[current] > arr[smallest]) counter++; char temp = arr[current]; arr[current] = arr[smallest]; arr[smallest] = temp; return arr; } |
หมายเหตุ
input หรือ ค่าที่ป้อนเข้า เมทอด นี้ คือ Char ที่เป็น อาร์เรย์ ,int ,int
output
คือ จะรีเทิน อาร์เรย์ char กลับคืนไป
counter คือ ตัวแปร counter ไว้นับจำนวนครั้งที่สลับที่ของข้อมูล
counter คือ ตัวแปร counter ไว้นับจำนวนครั้งที่สลับที่ของข้อมูล
03:08:00
Java Project [ACM]
เมทอต charArr()
Aagkasit Tontan
เมทอต charArr()
เป็น เมทอต สำหรับนำค่าแปลง input ทีเป็น String แล้วก็ รีเทิน ค่า Character อาร์เรย์ กลับไป
//เอา input มาแปลงเป็น char และเก็บข้อใส่ array
static char[] charArr(String input){ //รับ String เข้ามา
// ทำการจอง array = ความยาวของ Stringที่เข้ามา
char [] charecter = new char[input.length()];
//วนลูป ดึง char ขี้นมาเก็บทีละช่อง
for(int i=0 ;i< input.length();i++){
charecter[i] = (char) input.codePointAt(i);
}
// วนลูปเสร็จก็ รีเทิน ค่ า char Array กลับไป
return charecter;
}
}
|
ทดสอบว่าใช้ได้จริง หรือไม่
02:46:00
Java Project [ACM]
ACM InceptionWatchQ JAVA
Aagkasit Tontan
Select language :
โจทย์ เป็นโจทย์ที่ยาวมาก อ่านแล้ว งง ก็ขอสรุปง่ายล่ะกันนะ
การแก้ปัญหา
input/output
โค้ดที่เขียนได้นะครับ
ACM InceptionWatchQ JAVA
โจทย์ เป็นโจทย์ที่ยาวมาก อ่านแล้ว งง ก็ขอสรุปง่ายล่ะกันนะ
การแก้ปัญหา
การแก้ปัญหาในข้อนี้ใช้การคำนวณทางคณิตศาสตร์ธรรมดา เพื่อค่าหาเวลาที่ผ่านไปของแต่ละชั้น ให้แปลงเวลาทั้งหมดเป็นหน่วยวินาที
ตอนแรกต้องหาค่าเวลา(วินาที) ณ จุดที่เข้าไปสู่ฝันชั้นถัดไป (Tnext) ให้ทำจากฝันชั้นแรกไปยังชั้นสุดท้าย
จากนั้น ให้คำนวณกลับจากชั้นสุดท้ายมายังชั้นแรก ในชั้นสุดท้าย (level n) จะคำนวณเวลาของ Tsk ที่ชั้นนั้นได้โดยตรง ส่วนชั้น n-1 ต้องเอาเวลาทั้งหมด(elapsed time) ของชั้น n หารด้วย 12 แล้วบวกกับ Tnext ของชั้นนั้น ก็จะได้ Tsk ของชั้น n-1
input/output
โค้ดที่เขียนได้นะครับ
| import java.util.Scanner; import java.util.Stack; public class InceptionW { static int s =1;//sec static int m =60;//sec static int h=3600;//=60*60 static int d=86400;//=24*60*60 static int y =31536000;//=365*24*60*60 public static void main(String[] args){ Scanner sc =new Scanner(System.in); InceptionW IW = new InceptionW(); Stack<Integer> stack = new Stack<Integer>(); String[] levels = new String[10]; int num=0,ans =0,count=0,co=0; char unit; String charten =""; while(true){ IW.cler(levels); String sin = sc.nextLine(); if(!sin.equals("-1")){ String[] in = sin.split(" "); count = Integer.parseInt(in[0]) ; unit = IW.findunit(sin); num = IW.tosecont(in[1], unit); stack.push (num); count ++; }else{ co = count; while(!stack.empty ()){ if(co-1 == ( int )stack.peek ()-1){ ans = (int)stack.pop();// }else{ ans = ans/12 + (int)stack.pop(); } co--; levels[co]=charten; } count = 0; co = 0; ans = 0; IW.print(levels); } } } public char findunit(String s){ return s.charAt(s.length()-1); } public int tosecont(String str,char c){ int num = Integer.parseInt(str); if(c == 's'){ num *= s; }else if(c == 'm'){ num *= m; }else if(c == 'h'){ num *= h; }else if(c == 'd'){ num *= d; }else if(c == 'y'){ num*=y; }else num =0; return num; } public String addcharecter(int num){ String n = num +""; String ans =""; String nr =revers(n); for(int i =0 ; i < 10 ;i++){ if(i > nr.length()) nr+="0"; } return ans = revers(nr); } public String revers(String num){ StringBuffer str_buff = new StringBuffer(num); str_buff.reverse(); String nr =str_buff.toString(); return nr; } public void print(String[] levels){ for(int i=0;i <levels.length;i++){ if(!(levels[i] =="0")) System.out.println(levels[i]); } } public void cler(String[] levels){ for(int i=0;i <levels.length;i++){ levels[i]="0"; } } } |
ผลการรันโปรแกรม
15:06:00
Java Project [ACM]
โจทย์ ACM MinimumSwapQ JAVA
Aagkasit Tontan
โจทย์ ACM MinimumSwapQ JAVA
เป็นการหาจำนวน ครั้งในการสลับที่ ที่น้อยที่สุดสำหรับการจัดเรียงข้อมูลตัวอักษรจากน้อยไปมาก
โจทย์
Minimum Swap
การเรียงข้อมูลเป็นขั้นตอนวิธีที่ถูกเรียกใช้บ่อยครั้งในการพัฒนาซอฟต์แวร์ซึ่งมีทั้งแบบจากน้อยไปมาก
และทั้งจากมากไปน้อย ซึ่งในการเรียงข้อมูลจะต้องมีการเปรียบเทียบและการสลับที่ของข้อมูล จงหาจำนวน
ครั้งในการสลับที่ ที่น้อยที่สุดสำหรับการจัดเรียงข้อมูลตัวอักษรจากน้อยไปมาก
input
แต่ละบรรทัดประกอบด้วยชุดของตัวอักษรตัวเล็ก (a ถึง z) โดยอินพุทแต่ละชุดจะไม่มีตัวอักษรที่
ซ้ำกัน อินพุทสิ้นสุดเมื่อพบข้อความ “000”
output
ผลลัพธ์แต่ละบรรทัดให้ค่าจำนวนครั้งต่ำสุดในการสลับที่ข้อมูลที่ทำการเรียงลำดับของตัวอักษรจาก
น้อยไปมาก
ดูจาก output ของโปรแกรม คือ จะนับเฉพาะตำแหน่งที่อยู่ผิกตำแหน่งเท่านั้น สังเกตุจาก cba โปรแกรมจะนับเฉพาะที่ c สลับกับ a เท่านั้น output เลยได้ 1
code ที่ผมเขียนนะครับ
import java.util.Scanner;
/*** * @author JOKE */ public class MinimumSwap { int counter= 0; public static void main(String[] args){ MinimumSwap MT = new MinimumSwap(); Scanner sn =new Scanner(System.in); String input =""; try{ while(!(input = sn.nextLine()).equals("000")){ char [] charecter = MT.charArr(input); int current = 0, last = charecter.length-1; int walker, smallest; while(current < last) { smallest = current; walker = current + 1; while(walker <= last) { //วนหาอักษรที่เล็กที่สุด if(charecter[smallest] > charecter[walker]) smallest = walker; walker++; }//เจอแล้วก็สลับตำแหน่งกัน MT.swap(charecter, current, smallest); current++; } MT.print();// แสดงจำนวนที่สลับ } }catch(Exception e){ System.out.println(e.getClass()); System.out.println("Re-enter.!!!"); } } public char[] charArr(String input){ char [] charecter = new char[input.length()]; for(int i=0 ;i< input.length();i++){ charecter[i] = (char) input.codePointAt(i); } return charecter; } // เมทอดสำหรับ สำหรับ สลับตำแหน่ง public char[] swap(char[] arr, int current, int smallest) { if(arr[current] > arr[smallest]) counter++; char temp = arr[current]; arr[current] = arr[smallest]; arr[smallest] = temp; return arr; } void print(){ System.out.println(counter); counter = 0; } } |
ดูโค้ดแล้วสงสัยก็ เข้าไปดู อธิบายโค้ดอย่างละเอียด MinimumSwapQ JAVA ได้นะครับ
หรือ จะเอา code ไปรันดู ก็ได้ นะครับ
04:39:00
Java Project [ACM]
โจทย์ ACM OpStringQ JAVA
Aagkasit Tontan
โจทย์ opstring
โจทย์นี้เคยทำมาครั้งหนึ่งแล้วตอนสอบ เก็บคะแนนปฏิบัติ วิชาโครงสร้างข้อมูล ปรากฎว่าทำยังไงก็ไม่ออก และสุดท้ายผมก็เอฟวิชานี้ จึงทำให้ผมเข้าอย่างแท้จริงว่า การเขียนโปรแกรม คือ เราต้องคิดแก้ปัญหาในโลกความจริงก่อน เช่น ถ้าเป็นโปรคำนวนหาผลลัพธ์เราควรจะหาผลลัพธ์ด้วยมือก่อน แล้วค่อยไปเขียนโปรแกรม
input/output
หลักการ ที่สำคัญ มี
- ตัวเลขที่ปนกับตัวอักษรให้ดึงเอาเฉพาะตัวเลขมาคิด
- แล้วก็ดึงตัวเลขลออกมาเป็นชุดๆโดยไม่ให้เกินค่าที่้เขากำหนด
- จากนั้นก็เอาตัวเลข มากระทำกับตัวดำเนินการ(operators) เพื่อหาผลลัพธ์
ดาวโหลดตัวโปรแกรมที่นี่ code
ดาวโหลดตัวโปรแกรมที่นี่ code นี้นำ arraylist มาเก็บข้อมูล
+!!! อย่าลืมสร้างไฟล์ c.in ไว้ที่ C:\c.in
ข้อมูลอ่านเพิ่มเติม
03:54:00
Java Project [ACM]
Subscribe to:
Posts
(
Atom
)



