公告區

Work Harder!!!!

2009年5月28日 星期四

2 Examples

Report Card :
ID,CourseName01,Grade01,CourseName02,Grade02,......
1,國文上,92,普通物理學甲上,100,計算機程式設計,100

Account_Password :
account,password
b97902020,neverRevoke

JAVA - 字串轉換

1. 由 基本資料型態轉換成 String

String 類別中已經提供了將基本資料型態轉換成 String 的 static 方法
也就是 String.valueOf() 這個參數多載的方法

有下列幾種

String.valueOf(boolean b) : 將 boolean 變數 b 轉換成字串

String.valueOf(char c) : 將 char 變數 c 轉換成字串

String.valueOf(char[] data) : 將 char 陣列 data 轉換成字串

String.valueOf(char[] data, int offset, int count) :
將 char 陣列 data 中 由 data[offset] 開始取 count 個元素 轉換成字串

String.valueOf(double d) : 將 double 變數 d 轉換成字串

String.valueOf(float f) : 將 float 變數 f 轉換成字串

String.valueOf(int i) : 將 int 變數 i 轉換成字串

String.valueOf(long l) : 將 long 變數 l 轉換成字串

String.valueOf(Object obj) : 將 obj 物件轉換成 字串, 等於 obj.toString()

用法如:
int i = 10;
String str = String.valueOf(i);
這時候 str 就會是 "10"

2. 由 String 轉換成 數字的基本資料型態

要將 String 轉換成基本資料型態轉
大多需要使用基本資料型態的包裝類別

比如說 String 轉換成 byte
可以使用 Byte.parseByte(String s)
這一類的方法如果無法將 s 分析 則會丟出 NumberFormatException

byte :
Byte.parseByte(String s) : 將 s 轉換成 byte
Byte.parseByte(String s, int radix) : 以 radix 為基底 將 s 轉換為 byte
比如說 Byte.parseByte("11", 16) 會得到 17

double :
Double.parseDouble(String s) : 將 s 轉換成 double

float :
Double.parseFloat(String s) : 將 s 轉換成 float

int :
Integer.parseInt(String s) : 將 s 轉換成 int

long :
Long.parseLong(String s) : 將 s 轉換成 long

2009年5月27日 星期三

5/30團練

這次改到下午好了
13:00-16:00
有意者請推文~

2009年5月24日 星期日

5/24團練結果-ACM10325及ACM10228

團練參考網址:
Inclusion-Exclusion Principle
http://www.csie.ntnu.edu.tw/~u91029/Inclusion-ExclusionPrinciple.html
Extremum
http://www.csie.ntnu.edu.tw/~u91029/Extremum.html




/*JW's AC Code in ACM 10325*/

#include<stdio.h>
#define MAX 16

long long n,m;
long long marray[MAX];

void init(long long array[MAX])
{
long long i;
for(i=0;i<MAX;i++)array[i] = 0;
}

long long gcd(long long a,long long b)
{
return b?gcd(b,a%b):a;
}

long long lcm(long long a,long long b)
{
return a/gcd(a,b)*b;
}

long long backtrack(long long c,long long w,long long d)
{
if(c==m)return w*(n/d);
return backtrack(c+1,w,d)+backtrack(c+1,-w,lcm(d,marray[c]));
}

int main()
{
while(scanf("%d%d",&n,&m)==2)
{
init(marray);
long long i;
for(i=0;i<m;i++)scanf("%lld",&marray[i]);
printf("%lld\n",backtrack(0,1,1));
}
return 0;
}



/*ApplerMan's AC code in ACM 10228*/

#include<stdio.h>
#include<math.h>

double countDistance(double x1,double y1,double x2,double y2){
return pow((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2),0.5);
}
double totalDistance(int N,double point[100][2],double x,double y){
int i;
double total=0;
for(i=0;i<N;i++){
total+=countDistance(x,y,point[i][0],point[i][1]);
}
return total;
}
double xbisection(int N,double point[100][2],double y,double a, double b){
double fa,fb,c=(a+b)/2,fc=totalDistance(N,point,c,y),d;
for(d=fabs(b-a)/4;d>1e-5;d/=2){
a=c-d,b=c+d,fa=totalDistance(N,point,a,y),fb=totalDistance(N,point,b,y);
if(fa<fc) c=a,fc=fa;
else if(fb<fc) c=b,fc=fb;
}
return fc;
}
double ybisection(int N,double point[100][2],double a,double b){
double fa,fb,c=(a+b)/2,fc=xbisection(N,point,c,0,10000),d;
for(d=fabs(b-a)/4;d>1e-5;d/=2){
a=c-d,b=c+d,fa=xbisection(N,point,a,0,10000),fb=xbisection(N,point,b,0,10000);
if(fa<fc) c=a,fc=fa;
else if(fb<fc) c=b,fc=fb;
}
return fc;
}
int main(){
int M,N,i;
double point[100][2];
scanf("%d",&M);
while(M--){
scanf("%d",&N);
for(i=0;i<N;i++) scanf("%lf %lf",&point[i][0],&point[i][1]);
printf("%.lf\n",ybisection(N,point,0,10000));
if(M>0) printf("\n");
}
return 0;
}





團練討論:

ACM10325:

須使用long long 避免WA
如以下測資
2000000000 14
1073741789 1073741783 1073741741 1073741723 1073741719 1073741717 1073741689 1073741671 1073741663 1073741651 1073741621 1073741567 1073741561 1073741527
答案是1999999986
long long 在dev c++使用%I64d;
在Linux下使用 %lld
上傳皆使用%lld

ACM10228:

這題除了演算法,還要用些數學概念
切割xy平面去找極小值,
這題無特定公式可以直接求解,
在xy平面上,每一點對應到一個f(x,y)
f(x,y)即為一個曲面函數
求曲面上極大極小值要用lagrange
所以這題直接用切割平面的方式找極小較為容易
這意這題f(x,y)只出現一個極值,故可以不必分段找極大極小
因為他只有一個極小。

2009年5月23日 星期六

5/24團練

5/24 團練

練習ACM題目

預計9:00~12:00

可出席者請推個文吧!

還有panda上次的團練成果還沒PO上來哦

要不要我來用XD

另外~祝英檢中高級順利通過初試!

UML-Implement Time

端午節5/28(四)

八點整! R217!

不見不散!

一次搞定!!




ps.請看到的回應一下

2009年5月22日 星期五

給蘋果人

記得決定時間後po個文

2009年5月21日 星期四

UML - Class

class Course {
int courseID;
int credit
String courseName;
String professorName;
boolean[] student;
String department;
int restrictionID;
int[] time;
String location;
String P.S.;
}

class Human {
String name;
int ID;
}

class Student extends Human {
String department;
Schedule mySchedule;
}

class Prfessor extends Human {
String department;
}

class Administrator extends Human {
}

class Schedule {
String[] timeTable;
Course[] courses;
}

class ReportCard {
double[] grade;
String[] courseName;
int ID;
}

class OldSystem {
}

JAVA - 其他技術

這個是用來停止的
下面是停止兩秒

try {
Thread.sleep(2000L); //2 Seconds
}
catch (Exception e) {}


這是用來刷掉螢幕的
似乎是控制碼
可跨平台

System.out.println(((char) 27)+"[2J");

JAVA - 檔案處理

發現BufferedReader還好用的
大家還是多學學比較好
這個裡面有包含讀和寫了

import java.io.*;

public class FileIO {
public static void main(String[] args) throws IOException {
BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));

String fileName = keyin.readLine();

FileReader fileInput = new FileReader(fileName);
BufferedReader fr = new BufferedReader(fileInput);

String Temp;
String Data = "";

while((Temp = fr.readLine()) != null)
Data += Temp + "\n";

System.out.println(Data);

fileName = keyin.readLine();
FileWriter fw = new FileWriter(fileName);

fw.write(Data);
fw.flush(); //This is important,without it,the file won't be written.
}
}

Java的getch()

getch()在c當中
是用來讀入字元
但是不用按enter就會進行下去
簡單講就是「press any key to continue」的功能

在小的用盡全力google了兩天後
確定是沒這個東西了
所以設計出來的感覺可能會有些不一樣

之後請問田神後
知道還有「jni」可以試試(據說是讓java去跑c的code)
不過會造成沒辨法跨平台
再取捨吧~

2009年5月20日 星期三

JAVA - Keyboard Input

正如蘋果人所言
在java 6 之後
多了這個方法來讀取
十分的方便
不過在esclipse中不能使用
請注意

import java.io.Console;

public class ConsoleDemo {
public static void main(String[] args) {
System.out.print("請輸入名稱:");

Console console = System.console();
String name = console.readLine();

System.out.println("您輸入的名稱:" + name);
}
}


還有更方便的
輸入之後不顯示出來
這在打密碼時很重要

import java.io.Console;

public class ConsoleDemo {
public static void main(String[] args) {
System.out.print("請輸入名稱:");

Console console = System.console();
String name = console.readLine();

char[] password = console.readPassword("請輸入密碼:");
System.out.println("您輸入的名稱:" + name);
System.out.println("您輸入的密碼:" + new String(password));
}
}

UML - flow of event 工作分配

1. Login - 3M
2. View Course - JW
3. Register Course - JW
4. Distribute Course - JW
5. Add Course - 3M
6. Give Out Result - AP
7. View Report Card - DP
8. Submit Grade - DP
9. Billing - AP
10. Grading - DP

2009年5月19日 星期二

UML死線

嘖嘖
明天就是死線了
記得在下午78到地下室集合
以上

2009年5月18日 星期一

關於750的輸出格式

想請問兩位這一題過了嗎?

他的標準輸出格式到底是怎麼樣子的呢?

2009年5月16日 星期六

5/18早上開團

注意是5/18 9:00-12:00
9:10前msn請上線

早上UML調課
就來練習吧~

要參加的回覆一下~

UML

Use Case Diagram
JW-Course Registration System
AP-Billing System
3M-Login System
//-The Relationship between systems
3M-Old System VS New System
DP-Report Card System

Class Diagram
3M-Log in
-New System
-User Account
-Student
-Professor
-Administrator

JW-View Courses
-Student
-Professor
-Administrator
-Courses
-New System

JW-Courses Register
-Student
-New System
-Course
-Schedule
-Report Card
-Professor

JW-Add Course
-Professor
-New System
-Course

AP-Distribute Course
-New System
-Course
-Schedule
-Bill

AP-Result
-Bill
-Student
-New System
-Schedule
-Professor
-Course

DP-Grading
-New System
-Report Card
-Professor

DP-View Report Card
-Student
-Report Card
-New System

DP-Submit grades
-Old System
-New System
-Administrator
-Report Card

2009年5月3日 星期日

5/3團練記錄

參考網站:http://www.csie.ntnu.edu.tw/~u91029/Permutation.html

做了一題練習
因為在審題上出了問題
An upper case letter goes before the corresponding lower case letter.
這一句話的意思是
當我們在排序時
大寫是在小寫前面的
所以
比如說input是
AaBbCc
在沒有處理的前提下
第一個output可能會變成
ABCabc //也就是字典順序
這一點要注意

/*JW's AC Code in ACM 195*/

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX 1024

char Input[MAX]; //輸入
char ans[MAX]; //存排列的結果
char used[MAX]; //用過的

int cmp1(const void *a,const void *b)
{
return (*(char*)a-*(char*)b);
}

//Quick Sort用
int cmp2(const void *a,const void *b)
{
return (tolower(*(char*)a)-tolower(*(char*)b));
}

//排列
void p(int k,int len)
{
if(k==len)
{
int i;
for(i=0;i<len;i++)printf("%c",ans[i]);
printf("\n");
return;
}
char LastLetter='\0';
int i;
for(i=0;i<len;i++)
{
if(used[i]==0 && LastLetter!=Input[i])
{
LastLetter=Input[i];
used[i]=1;
ans[k]=Input[i];
p(k+1,len);
used[i]=0;
}
}
}

int main()
{
int N;
scanf("%d",&N);
int i;
for(i=0;i<N;i++)
{
scanf("%s",Input);
int len=strlen(Input);
int j;
for(j=0;j<len;j++)used[j]=0;
qsort(Input,len,sizeof(char),cmp1);
qsort(Input,len,sizeof(char),cmp2);
p(0,len);
}
return 0;
}





/*ApplerMan's AC Code in ACM 195*/
#include<stdio.h>
#include<string.h>
#define MAX 1000

int charNum[52],length;
char solution[MAX];//解答

void permutation(int k,int n){
int i;
if(k==n){
for(i=0;i<n;i++){
printf("%c",solution[i]);
}
printf("\n");
return ;
}
for(i=0;i<52;i++){
if(charNum[i]>0){
charNum[i]--;
if(i%2==0){
solution[k]=(i/2)+'A';//取出來
}
else{
solution[k]=(i/2)+'a';//取出來
}
permutation(k+1,n);
charNum[i]++;
}
}
}

void input(void){
int i;
char str[MAX];
gets(str);
length=strlen(str);
for(i=0;i<length;i++){
if('A'<=str[i]&&str[i]<='Z'){
charNum[(str[i]-'A')*2]++;//編入
}
else if('a'<=str[i]&&str[i]<='z'){
charNum[(str[i]-'a')*2+1]++;//編入
}
}
}

void init(void){
int i;
for(i=0;i<52;i++)
charNum[i]=0;
}

int main(void){
int N;
scanf("%d\n",&N);
while(N--){
init();//負責初始化
input();//輸入部分
permutation(0,length);//遞迴
}
return 0;
}

//charNum[0]表示A的數量
//charNum[1]表示a的數量
//charNum[2]表示B的數量

2009年5月1日 星期五

田神訪談記錄

Q1 老師當初是怎麼學的,如何從不會到能夠比ACM World Final?
在剛入大學時,和兩個IOI強者的高中同學組隊,也因此從同學那裡學到了很多,除了教會當時的教授不少東西之外,也提供了不少書籍作為參考,而教授本身對於閱讀書籍本來就有興趣,因此學到了很多,學習的方式則是辨固定時間的讀書會,一次兩到三個小時,當時由於Online Judge的網站剛開始出現,因此有一股風潮在資訊系出現,這樣的風氣也有一些幫助,到了大二時,開始更為嚴肅看待比賽這件事,而且當時大陸的隊伍也開始參賽了,所以壓力相對的也比較大,之後在努力之下才到了ACM World Final,在學習方面,教授認為,重點在於知道用什麼方法去解決一個問題,如何從數學的思考轉移到程式的演算法上的思考,同時教授也提出了一個以往自己的訓練的方式,就是一種在紙上寫程式的方法,這種方式可以鍛練自己在self compiling和self testing上的能力。

Q2 ACM比賽時的解題方向?
分析題目(找出比較ok的題目)
分出三種類別
第一類的題目重點在速度
第二類的題目重點在做出自己能力能及的題目
第三類的題目重點在於團隊合作解出(最難的部分)

Q3 現在的學習風氣和過去的感覺有什麼不同?
和過去比較起來,現在的機會多很多,並不是說不好,而是讓競爭的感覺沒有以前那麼強烈,過去的競爭壓力大,若是不努力的話,本來在你之後的人很快就會追上來,也因此才會加倍的努力。

Q4 我們這樣的練習方式妥不妥?也就是利用題目來磨練觀念。
剛開始是好方法,但長久來說還是把重點放在了解演算法的內容進而活用。

Q5 還有如何進步,是看別人寫的code嗎?哪裡有資源?
看別人寫的code是個不錯的方法,而且可能還蠻需要的,可以在其中找一些自己覺得很好的方式,進而內化了解,同時在比賽時,也有很高的可能性需要幫別人debug(包括平時),因此看別人的code是個不錯的學習方式,資源方面,可以看一些有solution和別人寫的code的地方,例如NTU online judge,如果需要的話,可以和助教伸帳號。

Q6 這些比賽對於未來的幫助。
可能有,但是大多數的時候,能夠在比賽中有所表現的人,在各方面的課業表現上都不會太差,也因此我們不能說有絕對的關係,但不論之後在比賽有沒有得到好成績,若是願意在這方面努力的話,實力就會有一定程度的累積,那就夠了。

Q7 ACM比賽的學習和準備上的方法。
重點在還是在於有固定的讀書會,首先可以先召集一些人(約3-5個),然後可以先讓每個人分享一下自己學到的一些演算法之類的,並且一起練習分享等,頻率方面則是一個到兩個星期一次,一次兩到三個小時。


----------------------------------------------------------------------------------

因為是隔了一天才整理好,內容方面可能會有一點出入,所以任何覺得怪怪的地方都有可能是我寫錯了,也可能是記錄時誤解教授的意思,有問題請提出吧~