Powered By Blogger

Tìm kiếm Blog này

Thứ Tư, 8 tháng 9, 2010

Solution 3838. Tuyến xe du lich hội trợ (vn.spoj.pl)

Link:
3838. Tuyến xe du lich hội trợ
Mã bài: SHUTTLE

Mặc dù Farmer John không có khó khăn gì khi đi bộ quanh hội trợ để thu thập những thứ mong ước hoặc xem các gian trưng bầy, những con bò của anh ta không thực sự khỏe mạnh; nên sau cả một ngay đi bộ quanh hội trợ đã làm họ rất mệt. Để giúp chúng thích hội trợ, FJ đã sắp xếp một chuyến xe dẫn những chú bò từ địa điểm này đến địa điểm khác trong hội trợ.

FJ không có đủ tài chính để trả một chuyến đi quá dài, nên hành trình mà anh ta thêu đi qua các tuyến đường đú một lần. Có N điểm dừng trong hội trợ (1 <= N <= 20,000) (được đánh số từ 1 đến N) dọc theo tuyến đường của nó. Có tổng cộng K nhóm (1 <= K <= 50,000) bò được đánh số từ 1..K muốn đi hành trình đó, mỗi con trong M_i con bò (1 <= M_i <= N) trong nhóm i muốn đi từ điểm dừng S_i (1 <= S_i < E_i) tới điểm dừng khác E_i (S_i < E_i <= N) theo dọc hành trình đó.

Xe hành trình không thể mang toàn bộ nhóm của những chú bò vì bị giới hạn bởi tối đa được trở, nhưng ban có thể lấy một phân của các nhóm sao cho thích hợp.

Cho gới hạn tối đa được trở C (1 <= C <= 100) của xe và những miêu tả các nhóm bò mà muốn tham những điểm dừng khác nhau trong hội trợ, hay xác định số lượng con bò lớn nhất có thể đi tuyến xe trong hội trợ.
Dữ liệu

* Dòng một 1: Ba số nguyên được viết cách nhau: K, N, và C

* Dòng 2..K+1: Dòng i+1 miêu tả nhóm bò i bằng ba số nguyên dương được viết cách nhau : S_i, E_i, and M_i
Kết quả

* Dòng 1: Số lượng con bò lớn nhất có thểm đi tuyến xe ở hội trợ.
Ví dụ

Dữ liệu:

8 15 3
1 5 2
13 14 1
5 8 3
8 14 2
14 15 1
9 12 1
12 15 2
4 6 1

Kết quả :

10

Giải thích:

Xe có thể trở 2 con bò từ điểm dừng 1 đến điểm dừng 5, 3 từ 5 đến 8, 2 từ 8 đến 14, 1 từ 9 đến 12, 1 từ 13 đến 14, và 1 từ 14 đến 15.

Code:
#include
#include
#include
#include
#include

using namespace std;

struct street
{
int S;
int E;
int M;
bool operator<(const street &temp)const
{
return S}
};


int main()
{
// ifstream in ("TEST.INP");
// ofstream out ("TEST.OUT");
int N,K,C;
int i;

int result=0;
int temp=0;

// in >> K >> N >> C;
cin >> K >> N >> C;
vector streets;
streets.resize(K);
for(i=0;i// in >> streets[i].S >> streets[i].E >> streets[i].M;
cin >> streets[i].S >> streets[i].E >> streets[i].M ;
sort(streets.begin(),streets.end());
map Path;
for(i=0;i{
int S=streets[i].S;
map::iterator it=Path.begin();
while(it!=Path.end()&&it->first<=S)
{
result+=it->second;
temp-=it->second;
Path.erase(it++);
}
Path[streets[i].E]+=streets[i].M;
temp+=streets[i].M;
it=Path.end();
--it;
while(temp>C)
{
if(temp-it->second>=C)
{
temp-=it->second;
Path.erase(it--);
}
else
{
it->second-=temp-C;
temp=C;
}
}
}
// out << result+temp;
cout <return 0;
}

Solution 2783. Hoán vị chữ cái (vn.spoj.pl)

Link:
2783. Hoán vị chữ cái
Mã bài: QBHV

Cho một xâu S chỉ gồm các chữ cái in hoa, 1 <= độ dài <= 9.

Yêu cầu:

1: Có bao nhiêu cách hoán vị các chữ cái của xâu S

2: Liệt kê các hoán vị đó theo thứ tự từ điển
Input

Gồm 1 dòng duy nhất chứa xâu S
Output

Dòng 1: Ghi số lượng hoán vị tìm được (K)

K dòng tiếp theo, mỗi dòng ghi một xâu hoán vị của xâu S theo đúng thứ tự từ điển
Example

Input:
ABAB
Output:
6
AABB
ABAB
ABBA
BAAB
BABA
BBAA

Code:
#include
// #include
#include

char s[10];
char kq[363000][10];
char t[10];
int d[200];
int n;
long int gt[11]={1,1,2,6,24,120,720,5040,40320,362880};
long int kqua;
long int num=0;


void Try(int i);

int main()
{
scanf("%s",&s);
int i;
char c;

for(i=1;i<200;i++) d[i]=0;
n=strlen(s);
for(i=0;i// for(c='A';c<='Z';c++) printf("d[%c]=%d%s\n",c,d[c]," ");

kqua=gt[n];
for(c='A';c<='Z';c++)
kqua=kqua/gt[d[c]];
printf("%ld\n",kqua);
Try(0);
i=1;
while(i<=kqua)
{
printf("%s\n",kq[i]);
i++;
}


// getch();
return 0;
}
void Try(int i)
{
char j;
if(i==n)
{
t[n]='\0';
num++;
strcpy(kq[num],t);
}
else
{
for(j='A';j<='Z';j++)
if(d[j]>0)
{
d[j]--;
t[i]=j;
Try(i+1);
d[j]++;
}
}
}

Thứ Ba, 31 tháng 8, 2010

Solution 937. Chữ số tận cùng khác 0 (vn.spoj.pl)

Link : http://vn.spoj.pl/problems/TCDFZ/


937. Chữ số tận cùng khác 0
Mã bài: TCDFZ

Cho số tự nhiên n (n <= 10^9). Hãy tìm chữ số tận cùng khác 0 của n!
Input

- Dòng duy nhất ghi số N.
Output

- Gồm 1 dòng duy nhất ghi kết quả tìm được.
Example

Input:
5

Output:
2


#include
// #include

long int N;
int kq=1;
int ex[11];
int Pow(int x,int exp);

int main()
{
int chusocuoi;
long int tam;
int i;
long int num,numdiv5,numdis;
int mod;
scanf("%ld",&N);
while(N!=0)
{
numdis=N/10;
for(i=1;i<10;i++) ex[i]=numdis+1;
mod=N%10;
for(i=mod+1;i<10;i++) ex[i]--;
//Test
/* for(i=1;i<10;i++) if(i!=5)
{
printf("i=%d ex[%d]=%d\n",i,i,ex[i]);
}
getch(); */
for(i=1;i<10;i++) if(i!=5) kq=(kq*Pow(i,ex[i]))%10;
numdiv5=N/5;
int t=numdiv5%4;
for(i=0;i if(kq==8) kq=4;
else if(kq==4) kq=2;
else if(kq==2) kq=6;
else if(kq==6) kq=8;
N=N/5;
}
printf("%d",kq);
// getch();
return 0;
}
int Pow(int x,int exp)
{
if(exp==0) return 1;
else
{
if(exp%2==0)
{
int tam;
tam=Pow(x,exp/2);
return (tam*tam)%10;
}
else return((x*Pow(x,exp-1))%10);
}
}



Solution 3868. Total Flow (vn.spoj.pl)

Link : http://vn.spoj.pl/problems/MTOTALF/


3868. Total Flow
Mã bài: MTOTALF

English Vietnamese

Để quản lý nước cho đàn bò, FJ đã vẽ bản đồ đường ống gồm N (1<=N<=700)
ống trong trang trại mà nối bể nước với các chuồng. FJ thấy rằng các
đường ống có kích thước khác nhau và được nối một cách rất kỳ lạ.
Do đó, FJ muốn tính xem lượng nước truyền qua các ống.

Hai ống nước được nối liên tiếp với nhau cho phép lượng nước không vượt
quá thông lượng nhỏ nhất của hai ống. Một ống có thông lượng 5 nối với
ống có thông lượng 3 sẽ tương đương với một ống có thông lượng 3.:

+---5---+---3---+ -> +---3---+

Còn hai ống nối song song cho phép thông lượng nước là tổng thông lượng
của từng ống.

+---5---+
---+ +--- -> +---8---+
+---3---+

Còn một ống mà không nối với chuồng bò nào hay ống nào khác có thể bỏ đi:

+---5---+
---+ -> +---3---+
+---3---+--

Sử dụng cách thức trên, cho bản đồ đường ống, xác định lượng nước có thể
truyền từ nguồn (A) cho tới chuồng (Z).

Xét ví dụ sau:

+-----------6-----------+
A+---3---+B +Z
+---3---+---5---+---4---+
C D

Ống BC và CD có thể gộp lại được:

+-----------6-----------+
A+---3---+B +Z
+-----3-----+-----4-----+
D

Sau đó gộp BD và DZ :

+-----------6-----------+
A+---3---+B +Z
+-----------3-----------+

Gộp hai nhánh nối B và Z:

B
A+---3---+---9---+Z

Gộp AB và BZ và thông lượng thu được là 3:

A+---3---+Z

FJ cần viết một chương trình đọc vào một tập các đường ống mà mỗi
đường ống được mô tả thông qua 2 đầu nối và tính thông lượng từ 'A' tới 'Z'.

Mọi dữ liệu cần tính đều có thể suy luận theo các quy tắc bên trên.

Ống i nối hai nút a_i và b_i (a_i,b_i là các chữ cái hoa hoặc thường
- 'A-Za-z') và có thông lượng F_i (1 <= F_i <= 1,000).
Tên nút phân biệt chữ cái hoa và thường ('A' <> 'a').


INPUT

* Dòng 1: Số nguyên N

* Dòng 2..N + 1: Dòng i+1 mô tả ống i qua hai chữ cái và một số nguyên,
cách nhau bởi 1 dấu trống: a_i, b_i, and F_i

Ví dụ:

5
A B 3
B C 3
C D 5
D Z 4
B Z 6


OUTPUT

* Dòng 1: Lượng nước lớn nhất có thể truyền từ nguồn A tới chuồng Z.

Ví dụ:
3

Note : luyện viết code module chính bài này <=15 dòng với C/C++! Có thể giải bằng capacity scaling.



Code:
[code]
#include
// #include

#define MaxN 701

// const char *INP="TEST.INP";

int N;
long int af[52][52];
int F[MaxN];

long int Min(long int x,long int y);

int main()
{
int i,j;
int dau,giua,cuoi,dinh;
char a,b,c;
int d;
char s[10];
// FILE *f;
// f=fopen(INP,"rt");
// fscanf(f,"%d",&N);
scanf("%d",&N);
for(i=0;i {
// fscanf(f,"%*c%c%*c%c%d",&a,&b,&d);
scanf("%*c%c%*c%c%d",&a,&b,&d);
// printf("a=%d b=%d d=%d\n",a,b,d);
if(a>='a'&&a<='z') a+='Z'+1-'a';
if(b>='a'&&b<='z') b+='Z'+1-'a';
// printf("a=%d b=%d d=%d\n",a,b,d);
// printf("a-A=%d\n",a-'A');
af[a-'A'][b-'A']+=d;
af[b-'A'][a-'A']+=d;
// printf("af[%d][%d]=%d\n",a-'A',b-'A',af[a-'A'][b-'A']);
}
// fclose(f);
int rutgon;
do
{
rutgon=0;
for(giua=0;giua<52;giua++)
if(giua!=0&&giua!=25)
{
dau=-1;
cuoi=-1;
dinh=0;
for(j=0;j<52;j++)
if(af[giua][j]!=0)
{
if(dau==-1) dau=j;
else if(cuoi==-1) cuoi=j;
else dinh=1;
}
if(dinh) continue;
if(cuoi!=-1)
{
af[dau][cuoi]+=Min(af[dau][giua],af[giua][cuoi]);
af[cuoi][dau]+=Min(af[dau][giua],af[giua][cuoi]);
af[dau][giua]=0;
af[giua][dau]=0;
af[cuoi][giua]=0;
af[giua][cuoi]=0;
rutgon=1;
}
else if(dau!=-1)
{
af[dau][giua]=0;
af[giua][dau]=0;
rutgon=1;
}
}
}
while(rutgon);
printf("%ld",af[0][25]);
// getch();
return 0;
}
long int Min(long int x,long int y)
{
if(x return y;
}

[/code]

Thứ Hai, 30 tháng 8, 2010

Solution 2. Prime Generator (SPOJ)

Link : https://www.spoj.pl/problems/PRIME1/
2. Prime Generator
Problem code: PRIME1

Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate all prime numbers between two given numbers!
Input

The input begins with the number t of test cases in a single line (t<=10). In each of the next t lines there are two numbers m and n (1 <= m <= n <= 1000000000, n-m<=100000) separated by a space.
Output

For every test case print all prime numbers p such that m <= p <= n, one number per line, test cases separated by an empty line.
Example

Input:
2
1 10
3 5

Output:
2
3
5
7

3
5

Warning: large Input/Output data, be careful with certain languages (though most should be OK if the algorithm is well designed)
Code:
#include
// #include

// const char *INP="TEST.INP";

int nt[3415];
int N,number;

void Init();
void Test();

int main()
{
Init();
int i;
int t;
long int a,b;
// FILE *f;
// f=fopen(INP,"rb");
// fscanf(f,"%d",&N);
scanf("%d",&N);
for(t=0;t {
scanf("%ld%ld",&a,&b);
// fscanf(f,"%ld%ld",&a,&b);
if(a%2==0&&a!=2||a==1) a++;
if(a==2)
{
printf("%d\n",a);
a++;
}
if(a==3)
{
printf("%d\n",a);
a+=2;
}
long int j=a;
while(j<=b)
{
for(i=2;i if(j%nt[i]==0) break;
if(nt[i]*nt[i]>j) printf("%d\n",j);
j+=2;
}
printf("\n");
}
// fclose(f);

// Test();
// getch();
return 0;
}
void Init()
{
nt[1]=2;
nt[2]=3;
nt[3]=5;
nt[4]=7;
nt[5]=11;
int i=5,j;
int x=13;
while(x<31700)
{
for(j=2;(j<=i)&&(nt[j]*nt[j]<=x);j++)
if(x%nt[j]==0) break;
if(nt[j]*nt[j]>x)
{
i++;
nt[i]=x;
}
x+=2;
}
number=i;
}
void Test()
{
printf("number=%d\n",number);
int i;
for(i=1;i<=number;i++)
{
printf("%d%s",nt[i]," ");
// if(i%100==0)// getch();
}
}

Thứ Sáu, 20 tháng 8, 2010

Solutoin Maya Calendar

Link đề bài: http://acm.pku.edu.cn/JudgeOnline/problem?id=1008

Maya Calendar
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 40388 Accepted: 12298

Description
During his last sabbatical, professor M. A. Ya made a surprising discovery about the old Maya calendar. From an old knotted message, professor discovered that the Maya civilization used a 365 day long year, called Haab, which had 19 months. Each of the first 18 months was 20 days long, and the names of the months were pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu. Instead of having names, the days of the months were denoted by numbers starting from 0 to 19. The last month of Haab was called uayet and had 5 days denoted by numbers 0, 1, 2, 3, 4. The Maya believed that this month was unlucky, the court of justice was not in session, the trade stopped, people did not even sweep the floor.

For religious purposes, the Maya used another calendar in which the year was called Tzolkin (holly year). The year was divided into thirteen periods, each 20 days long. Each day was denoted by a pair consisting of a number and the name of the day. They used 20 names: imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau and 13 numbers; both in cycles.

Notice that each day has an unambiguous description. For example, at the beginning of the year the days were described as follows:

1 imix, 2 ik, 3 akbal, 4 kan, 5 chicchan, 6 cimi, 7 manik, 8 lamat, 9 muluk, 10 ok, 11 chuen, 12 eb, 13 ben, 1 ix, 2 mem, 3 cib, 4 caban, 5 eznab, 6 canac, 7 ahau, and again in the next period 8 imix, 9 ik, 10 akbal . . .

Years (both Haab and Tzolkin) were denoted by numbers 0, 1, : : : , where the number 0 was the beginning of the world. Thus, the first day was:

Haab: 0. pop 0

Tzolkin: 1 imix 0
Help professor M. A. Ya and write a program for him to convert the dates from the Haab calendar to the Tzolkin calendar.

Input
The date in Haab is given in the following format:
NumberOfTheDay. Month Year

The first line of the input file contains the number of the input dates in the file. The next n lines contain n dates in the Haab calendar format, each in separate line. The year is smaller then 5000.

Output
The date in Tzolkin should be in the following format:
Number NameOfTheDay Year

The first line of the output file contains the number of the output dates. In the next n lines, there are dates in the Tzolkin calendar format, in the order corresponding to the input dates.

Sample Input

3
10. zac 0
0. pop 0
10. zac 1995

Sample Output

3
3 chuen 0
1 imix 0
9 cimi 2801

Source
Central Europe 1995


Code:
Source Code
Problem: 1008 User: ductam1983
Memory: 164K Time: 0MS
Language: C Result: Accepted

* Source Code

#include
// #include
#include


// const char *INP="TEST.INP";


char Haab[19][7] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol",
"chen","yax", "zac", "ceh", "mac", "kankin", "muan", "pax",
"koyab", "cumhu","uayet"};

char Tzolkin[20][9] = {"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik",
"lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem",
"cib", "caban", "eznab", "canac", "ahau"};


long int N;
int day,year,newday,newyear;
char month[10];
int newmonth;
char c;
long int numday;
int numofmonth;



int main()
{
long int i;
int j;
// FILE *f;
// f=fopen(INP,"rb");
// fscanf(f,"%ld",&N);
scanf("%ld",&N);
printf("%d\n",N);
i=0;
while(i {
/* fscanf(f,"%d",&day);
fscanf(f,"%s",&c);
fscanf(f,"%s",&month);
fscanf(f,"%d",&year); */
scanf("%d",&day);
scanf("%s",&c);
scanf("%s",&month);
scanf("%d",&year);
// printf("day=%d month=%s year=%d\n",day,month,year);
for(j=0;j<20;j++) if(strcmp(Haab[j],month)==0)
{
numofmonth=j+1;
break;
}
numday=365*year+(numofmonth-1)*20+day;
newyear=numday/260;
newmonth=(numday%260)%20;
newday=(numday%260)%13+1;
printf("%d%s%s%s%d\n",newday," ",Tzolkin[newmonth]," ",newyear);
i++;
}

// getch();
return 0;
}

Solution DNA Sorting

Link đề bài: http://acm.pku.edu.cn/JudgeOnline/problem?id=1007

DNA Sorting
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 48041 Accepted: 18810

Description
One measure of unsortedness in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence DAABEC, this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence AACEDGG has only one inversion (E and D)---it is nearly sorted---while the sequence ZWQM has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).

You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of sortedness, from ``most sorted'' to ``least sorted''. All the strings are of the same length.

Input
The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.

Output
Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.

Sample Input

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT

Sample Output

CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA

Source
East Central North America 1998

Source Code
Problem: 1007 User: ductam1983
Memory: 172K Time: 0MS
Language: C Result: Accepted

* Source Code

#include
// #include


// const char *INP="TEST.INP";



char s[101][51];
int order[101];
int index[101];
int N,M;

void Sort(int t,int p);

int main()
{
int i;
int k,t;
int count;
// FILE *f;
// f=fopen(INP,"rb");
// fscanf(f,"%d%d",&N,&M);
scanf("%d%d",&N,&M);
for(i=0;i {
// fscanf(f,"%s",s[i]);
scanf("%s",s[i]);
index[i]=i;
count=0;
for(k=0;k for(t=k+1;t if(s[i][k]>s[i][t]) count++;
order[i]=count;
}
Sort(0,M-1);
for(i=0;i printf("%s\n",s[index[i]]);
// getch();
return 0;
}
void Sort(int t,int p)
{
int l,r,mid,valtemp,valmid;
l=t;
r=p;
mid=(l+r)/2;
valmid=order[mid];
while(l<=r)
{
while(order[l] while(order[r]>valmid) r--;
if(l<=r)
{
valtemp=order[l];
order[l]=order[r];
order[r]=valtemp;

valtemp=index[l];
index[l]=index[r];
index[r]=valtemp;
l++;
r--;
}
}
if(l if(t }