22-02-2009, 02:02 | |
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
Đang ngồi làm tí Nghịch con PNUMBER mà submit lên toàn bị kết quả sai mới láo
Thuật toán dùng linked list để lưu các số nguyên tố tìm được rồi chạy lần lượt từ 1 ~> b, hàm isPrime có trách nhiệm kiểm tra:
Có tí buồn nhé Code nè: [highlight=cpp]#include <cstdlib> #include <stdio.h> #include <math.h> typedef unsigned long int USLI; class Prime { public: Prime(USLI number): itsNumber(number), itsNext(0) {}; void setNext(Prime * next) {itsNext = next;}; USLI getNumber() const {return itsNumber;}; Prime * getNext() const {return itsNext;}; private: USLI itsNumber; Prime * itsNext; }; bool isPrime(USLI); Prime * pHead, * pLast; int main() { Prime * pNode; USLI a,b; scanf("%lu %lu",&a,&b); for(USLI i = 1; i < b; i++) { if (isPrime(i) == true) { pNode = new Prime(i); if (!pHead) pHead = pNode; if (pLast) pLast->setNext(pNode); pLast = pNode; if (i >= a && a <= b) printf("%lu\n",i); } } return 0; } bool isPrime(USLI number) { Prime * pNode; if (number == 1) return false; if (number == 2) return true; if (number % 2 == 0) return false; if (!pHead) return false; USLI limit = (USLI)sqrt(number); pNode = pHead; while (pNode->getNumber() <= limit) { if (number % pNode->getNumber() == 0) return false; pNode = pNode->getNext(); } return true; } [/highlight] |
22-02-2009, 06:20 | |
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
Cái này for là được anh ạ . Đây là code pascal. (thời đấy em chưa code C++ nhiều)
[highlight=pascal]var p:array[1..20000] of longint; np2,i:longint; a,b:longint; Function prime(c:longint):boolean; var j:longint; begin if c<=1 then exit(false); j:=1; while ((j<=np2) and (p[j]<=sqrt(c))) do begin if ((c mod p[j])=0) then exit(false); inc(j); end; exit(true); end; BEGIN read(a,b); np2:=0; for i:=2 to a-1 do if prime(i) then begin inc(np2); p[np2]:=i; end; for i:=a to b do begin if prime(i) then begin inc (np2); p[np2]:=i; writeln(i); end; end; END.[/highlight] Nếu cần trao đổi code có 2 phương án: 1 là vào hskl.net; 2 là vào vnoi.info (diễn đàn của nó). PS: Nên include cstdio, cmath,... hay thì stdio.h. Không nên lạm dụng class (làm chậm tốc độ chạy). Bài này int là đủ, cần gì cái chữ long nhỉ , mà C++ là long long chứ không phải long int. Còn long = int. @robin: C++ dễ đọc hơn chứ. ------------------------------ Hà Quang Dương blog.haqduong.com |
22-02-2009, 10:53 | |||
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
Đề bài này: Quote:
[highlight=cpp]#include <cstdio> int a,b; int np2 = 0; int pr [20000]; void readData() { scanf("%d %d", &a, &b); } bool isPrime(int s) { if (s <= 1) return false; for (int j = 0; (j < np2) && (pr[j]*pr[j] <= s); j++) { if (s % pr[j] == 0) return false; } return true; } void solve() { for (int i = 2; i <= a - 1; i++){ if (isPrime(i)) { pr[np2++] = i; } } for (int i = a; i <= b; i++) { if (isPrime(i)) { pr[np2++] = i; printf("%d\n",i); } } } int main() { readData(); solve(); } [/highlight] Kết quả này: Quote:
------------------------------ Hà Quang Dương blog.haqduong.com |
||
22-02-2009, 11:07 | |
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
Dùng for thì nói làm ji
Dùng linked list + long mới mở rộng ra sau này được mờ Cho chạy đến vài triệu, đợi mốc mép Rồi đi so sánh với bảng prime number thấy khớp nhá, thế mờ... Trước anh cũng không dùng class mà dùng struct nhưng giờ lười, dùng class cho tiện. Tóm lại là hem hiểu sao lại sai nhá PS: Mà các chú dùng highlighter đi nhá, cú pháp [highlight=pascal] hoặc [highlight=cpp], ngoài ra còn nhiều cái khác tự khám phá |
22-02-2009, 11:17 | |||
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
Quote:
PS: Các bạn thử làm bài này nhé: link Đề bài: Quote:
------------------------------ Hà Quang Dương blog.haqduong.com |
||
22-02-2009, 12:04 | ||
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
Phát hiện ra rồi
Ngu si ở dòng này: [highlight=cpp]for(USLI i = 1; i < b; i++)[/highlight] Phải là [highlight=cpp]for(USLI i = 1; i <= b; i++)[/highlight] Buồn man mác Quote:
|
|
22-02-2009, 12:28 | |
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
Cái highlighter làm hỏng hết code của em rồi
PS: Bạn nào giải được bài ROTATION sẽ có award (bao nhiêu thì tùy time với dùng ngôn ngữ gì), chỉ người đầu tiên làm được mới có thưởng, những người sau nếu xét thấy làm tốt hơn cũng thưởng. ------------------------------ Hà Quang Dương blog.haqduong.com |
22-02-2009, 13:28 | |
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
ROTATION cũng đơn giản Quyết tâm code theo OOP
[highlight=cpp]#include <cstdlib> #include <stdio.h> #define MAX_WHEEL 1000 #define DEBUG #undef DEBUG class Wheel { public: Wheel() {}; void setInfo(int id,Wheel * next,int type) {itsID = id; itsNext = next; itsType = type; itsDirection = 0;}; void roll(int direction) { itsDirection = direction; int nextDirection = direction-itsType; nextDirection = (nextDirection < 0?(-1)*nextDirection:nextDirection); #ifdef DEBUG printf("Wheel #%d direction = %d. Belt type = %d ~> Next wheel direction = %d\n",itsID,itsDirection,itsType,nextDirection); if (itsNext) { printf("Wheel #%d's next is #%d\n",itsID,itsNext->getID()); } else { printf("Wheel #%d has no next!\n",itsID); } #endif if (itsNext) itsNext->roll(nextDirection); }; int getDirection() {return itsDirection;}; int getID() {return itsID;}; #ifdef DEBUG void selfIdentify() { printf("I'm wheel #%d, my type is %d",itsID,itsType); if (itsNext) { printf(", my next is #%d\n",itsNext->getID()); } else { printf(", I have no next!\n"); } }; #endif private: int itsID; Wheel * itsNext; int itsType; int itsDirection; }; //Variables int n,i,tmp_id,tmp_next,tmp_type; Wheel theWheel[MAX_WHEEL]; void getInput() { #ifdef DEBUG printf("Input N: "); #endif scanf("%d",&n); for (i = 0; i < n-1; i++) { #ifdef DEBUG printf("Input ID,TARGET,TYPE (#%d): ",i+1); #endif scanf("%d %d %d",&tmp_id,&tmp_next,&tmp_type); theWheel[tmp_id-1].setInfo(tmp_id,&theWheel[tmp_next-1],tmp_type); } #ifdef DEBUG theWheel[n-1].setInfo(n,0,0); for (i = 0; i < n; i++) theWheel[i].selfIdentify(); #endif } void work() { theWheel[0].roll(0); } int printOutput() { #ifdef DEBUG printf("Final Direction = %d\n",theWheel[n-1].getDirection()); system("pause"); #else printf("%d",theWheel[n-1].getDirection()); #endif return 0; } int main() { getInput(); work(); return printOutput(); } [/highlight] |
22-02-2009, 13:54 | |
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
Chả hiểu sao code của chú thì lỗi còn của anh không sao nhỉ
Post lại rotation không có debug (SPOJ: 0.07 2.6MB C++) [highlight=cpp]#include <cstdlib> #include <stdio.h> #define MAX_WHEEL 1000 class Wheel { public: Wheel() {}; void setInfo(int id,Wheel * next,int type) {itsID = id; itsNext = next; itsType = type; itsDirection = 0;}; void roll(int direction) { itsDirection = direction; int nextDirection = direction-itsType; nextDirection = (nextDirection < 0?(-1)*nextDirection:nextDirection); if (itsNext) itsNext->roll(nextDirection); }; int getDirection() {return itsDirection;}; int getID() {return itsID;}; private: int itsID; Wheel * itsNext; int itsType; int itsDirection; }; //Variables int n,i,tmp_id,tmp_next,tmp_type; Wheel theWheel[MAX_WHEEL]; void getInput() { #ifdef DEBUG printf("Input N: "); #endif scanf("%d",&n); for (i = 0; i < n-1; i++) { scanf("%d %d %d",&tmp_id,&tmp_next,&tmp_type); theWheel[tmp_id-1].setInfo(tmp_id,&theWheel[tmp_next-1],tmp_type); } } void work() { theWheel[0].roll(0); } int printOutput() { printf("%d",theWheel[n-1].getDirection()); return 0; } int main() { getInput(); work(); return printOutput(); } [/highlight] PS: Đã fix lỗi highlighter |
22-02-2009, 20:54 | |||
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
Vâng, đã có 1 người AC ROTATION, các bạn cho anh mrpaint 1 tràng pháo tay
Còn đây là solution của tớ: [highlight=cpp]#include<cstdio> int readAndSolve() { int n,re,s,c,d; scanf("%d",&n); re = 0; for (int i = 2; i<=n; i++) { scanf("%d%d%d",&s,&c,&d); if (d==1) re++; } return re; } void writeData(int count) { printf("%i",count); } int main() { int count = readAndSolve(); writeData(count % 2); } [/highlight] [highlight=pascal]Var n,count,i,c:longint; BEGIN readln(n); count:=0; for i:=1 to n-1 do begin readln(c,c,c); count:=count xor c; end; write(count); END. [/highlight] Time: Quote:
Quote:
------------------------------ Hà Quang Dương blog.haqduong.com |
||
22-02-2009, 23:45 | |
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
QBMAX mình dính wrong answer mới ghét chứ Bài này cơ bản quy hoạch động + hình như là ví dụ để dạy quy hoạch động thì phải. Mà còn đơn giản hơn vì không bắt tìm đường. Chậc. Sao lại wrong answer được nhờ
Chú haqduong ngó hộ cái code đê [highlight=cpp]#include <cstdlib> #include <stdio.h> #define MAX 100 int m,n; int a[MAX][MAX]; long int q[MAX][MAX]; //q[i][j] store highest value to lead to a[i][j] const int VERYLOW = -255; void getInput() { #ifdef DEBUG printf("Nhap M & N: "); #endif scanf("%d %d",&m,&n); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) { #ifdef DEBUG printf("Nhap a[%d][%d]: ",i,j); #endif scanf("%d",&a[i][j]); } } long int max(int a,int b,int c) { if (a > b && a > c) return a; if (b > c) return b; return c; } long int qCalc(int row,int column) { if (row < 0 || row >= m) return VERYLOW; //return 0 value for invalid row request if (q[row][column] != 0) return q[row][column]; if (column == 0) { //no where to trace back, so... just return the value at a[row][column] q[row][column] = a[row][column]; return q[row][column]; } //get the highest value from 3-posible-cell that can lead to this cell long int highest = max( qCalc(row,column - 1) , qCalc(row-1,column-1) , qCalc(row+1,column-1) ); //the cost to go to this cell = the highest cost (above) plus this cell value q[row][column] = highest + a[row][column]; return q[row][column]; } void work() { int i,j; for (i = 0; i < m; i++) { q[i][n-1] = qCalc(i,n-1); } } int printOutput() { int i,highest; for (i = 0; i < m; i++) if (q[i][n-1] > highest) highest = q[i][n-1]; #ifdef DEBUG printf("Highest = "); printf("q array\n"); for (i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf("%3ld",q[i][j]); } printf("\n"); } #endif printf("%ld",highest); return 0; } int main() { getInput(); work(); int result = printOutput(); #ifdef DEBUG printf("\n"); system("pause"); #endif return result; }[/highlight] |
23-02-2009, 12:17 | |
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
Anh thử để cái này là MAX 101 đi, mà dùng const chứ dùng define làm gì ạ?
PS: anh cài đệ quy làm gì hay anh attach cái file vào đi, em debug cho tiện. ------------------------------ Hà Quang Dương blog.haqduong.com |
23-02-2009, 19:08 | ||
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
Quote:
- const int VERYLOW = -255; -> Đặt thành INT_MIN (include climits) - if (q[row][column] != 0) return q[row][column]; -> điều kiện sai. Tạm thời thế ------------------------------ Hà Quang Dương blog.haqduong.com |
|
23-02-2009, 20:49 | |
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
Cái VERYLOW có thể dùng -255 được vì đề bài có |aij| < 100 mà chú
Còn cái điều kiện chỉ để cải thiện tốc độ thôi mà (bỏ đi vẫn chạy nhưng chậm vì có những q nó sẽ tính đi tính lại, còn kiểm tra != 0 thì sẽ giảm một cách đáng kể việc tính toán) |
23-02-2009, 20:53 | ||
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
Quote:
Thế nhỡ cái ô đó nó tính ra là 0 thì vẫn phải tính lại còn gì. ------------------------------ Hà Quang Dương blog.haqduong.com |
|
23-02-2009, 21:18 | |||
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
Quote:
Quote:
[highlight=cpp]#include <cstdlib> #include <stdio.h> #define MAX 100 int m,n; int a[MAX][MAX]; long int q[MAX][MAX]; //q[i][j] store highest value to lead to a[i][j] const long int VERYLOW = -1*MAX*MAX - 1; void getInput() { #ifdef DEBUG printf("Nhap M & N: "); #endif scanf("%d %d",&m,&n); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) { #ifdef DEBUG printf("Nhap a[%d][%d]: ",i,j); #endif scanf("%d",&a[i][j]); } } long int max(int a,int b,int c) { if (a > b && a > c) return a; if (b > c) return b; return c; } long int qCalc(int row,int column) { if (row < 0 || row >= m) return VERYLOW; //return 0 value for invalid row request if (q[row][column] != VERYLOW) return q[row][column]; //just return value for calculated cell if (column == 0) { //no where to trace back, so... just return the value at a[row][column] q[row][column] = a[row][column]; return q[row][column]; } //get the highest value from 3-posible-cell that can lead to this cell long int highest = max( qCalc(row,column - 1) , qCalc(row-1,column-1) , qCalc(row+1,column-1) ); //the cost to go to this cell = the highest cost (above) plus this cell value q[row][column] = highest + a[row][column]; return q[row][column]; } void work() { int i,j; for (i = 0; i < m; i++) for (j = 0; j < n; j++) q[i][j] = VERYLOW; for (i = 0; i < m; i++) { q[i][n-1] = qCalc(i,n-1); } } int printOutput() { int i,highest; for (i = 0; i < m; i++) if (q[i][n-1] > highest) highest = q[i][n-1]; #ifdef DEBUG printf("Highest = "); printf("q array\n"); for (i = 0; i < m; i++) { for (int j = 0; j < n; j++) { printf("%3ld",q[i][j]); } printf("\n"); } #endif printf("%ld",highest); return 0; } int main() { getInput(); work(); int result = printOutput(); #ifdef DEBUG printf("\n"); system("pause"); #endif return result; }[/highlight] |
||
23-02-2009, 21:26 | |||
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
Tiếp này:
Đề bài: LIQ Quote:
Bài 2: Đề bài: LIS Quote:
PS: Lưu ý: nếu copy code thì để vào hide. ------------------------------ Hà Quang Dương blog.haqduong.com |
||
24-02-2009, 23:45 | |||
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
Cần làm rõ
Cho các số: Code:
19 3 14 9 7 20 7 13 15 23 25 15 14 22 3 24 3 11 5 11 Code:
3 5 11 14 22 24 Thế mà không hiểu sao bộ test (bài LIQ) lại như thế này nhỉ? Quote:
Quote:
PS: Dùng quy hoạch động chấm bài LIQ thì AC. Dùng cách O(nlogn) chấm LIS thì TLE, bê sang LIQ thì WA. Dùng bộ test thì thấy thế. Vậy là sao nhờ Code LIQ (Quy hoạch động) [hide] [highlight=cpp]#include <cstdlib> #include <stdio.h> #define MAXN 1000 typedef int atype; typedef int ntype; ntype n; atype a[MAXN]; ntype q[MAXN]; void getInput() { #ifdef DEBUG printf("Nhap N: "); #endif scanf("%d",&n); for (ntype i = 0; i < n; i++) { #ifdef DEBUG printf("Nhap a[%d]: ",i); #endif scanf("%d",&a[i]); } } ntype qCalc(ntype i) { if (q[i] > -1) return q[i]; ntype longest_before = 0; ntype tmp; for (ntype j = 0; j < i; j++) { if (a[j] < a[i]) { tmp = qCalc(j); if (tmp > longest_before) longest_before = tmp; } } q[i] = longest_before + 1; return q[i]; } void work() { ntype i; for (i = 0; i < n; i++) { q[i] = -1; } for (i = 0; i < n; i++) { qCalc(n-i-1); } } int printOutput() { ntype longest = 0; for (ntype i = 0; i < n; i++) { if (q[i] > longest) longest = q[i]; } #ifdef DEBUG printf("a array:\n"); for (ntype i = 0; i < n; i++) { printf("%3ld",a[i]); } printf("\n"); printf("q array:\n"); for (ntype i = 0; i < n; i++) { printf("%3ld",q[i]); } printf("\n"); printf("Longest = "); #endif printf("%ld",longest); return 0; } int main() { getInput(); work(); int result = printOutput(); #ifdef DEBUG printf("\n"); system("pause"); #endif return result; }[/highlight][/hide] |
||
24-02-2009, 23:50 | |
V.I.P
Join Date: 23-08-2005
Posts: 2.707
KL$:
854
Awarded 46 time(s) Sent 489 thank(s) Received 558 thank(s) School: PTTH Kim Liên
Class: A7 (2005-2008) Location: Hà Nội iu wí
|
Vừa lôi source quy hoạch động (ở trên) ra test lại với LIQ.IN3, kết quả = 6 Mà source này AC rồi nhá ~> bộ test bị sai àh?
PS: Bài trên dài quá, lười edit PS: AC cả 2 bài rồi |
25-02-2009, 16:48 | ||||
V.I.P
Join Date: 12-06-2007
Posts: 1.174
KL$ (TOP! 2):
17.089
Awarded 178 time(s) Sent 228 thank(s) Received 76 thank(s) School: PTTH Kim Liên
Class: A1 (2006-2009) Location: anywhere
|
3 bài thi năm ngoái này:
1. VOI08 Trò chơi với dãy số Đề bài: Quote:
2. VOI08 Lò cò Quote:
3. VOI08 Quà tết Quote:
------------------------------ Hà Quang Dương blog.haqduong.com |
|||