Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

 Задачка като за републиканска олимпиада
Автор  Black`n`White (11.07.2006 14:15) съобщение до автора
Погледнат  2139 пъти добави към любими
Оценка добави коментар
Гласове  2 изпрати на приятел
Коментари  (0) абонирай се за C-Cplusplus
     
Black`n`White
     
 

Видях доста интересни кодове тук и реших да добавя нещо и от мен ...
представлява задача от олимпиадата от май'06 ...

Условие

Метален прът трябва да бъде нарязан на няколко парчета. Цената в лева за извършване на едно отрязване е равна на дължината на рязания прът в метри. В даден момент може да бъде правен само един разрез. Различни стратегии за нарязване водят до различна цена.

Например да разгледаме прът с дължина 10 метра, който трябва да бъде нарязан във 2-рия, 4-тия и 7-мия метър. Бихме могли да извършим това като направим най-напред разрез в 2-ри метър, после в 4-ти метър и накрая 7-ми метър. Това струва 10 + 8 + 6 = 24 лева. Друг подход може да бъде да отрежем първо в 4-ти метър, после във 2-ри и в 7-ми метър. Сега цената е 10 + 4 + 6 = 20 лева.
Да се напише програма, която пресмята минималната цена на нарязване на прът с дадена дължина.

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// So... That’s all folks:
// Kompiliraite s MS Visual C++ 2005, Dev-C++ 4.9.9.2, ili drug
// kompilator, koito poddarja ISO-Standard C++ sas STL

#include <cstdlib>
#include
<iostream>
#include
<cmath>
#include
<algorithm>
#include
<vector>

using namespace std;

int main()
{
   
// collecting information about the cuts
   
int l,c;
   
cout << "Length: ";
   
cin >> l;
   
cout << "Number of the cuts: ";
   
cin >> c;
   
vector <int> i(c);
   
for (int a = 0; a < c; a++)
    {
       
cout << "Cut position no." << a+1 << ":";
       
cin >> i[a];
   
}
   
   
// n! is the number of all permutations
   
long excl = 1;
   
for(int a = 1; a < c; excl *= (a++)+1) ;
   
int* endprice;
   
endprice = new int[excl];
   
for(int a = 0; a < excl; endprice[a++] = 0);
   
   
// finding all possible cutting combinations
   
for(int a = 0; a < excl; a++)
    {
           
bool* graph;
       
graph = new bool[l+1];
           
for(int b = 0; b < l+1; graph[b++] = true);
           
graph[0] = graph[l] = false;
           
cout << "nTesting the combination:" << endl;
           
for(int b = 0; b < c; cout << i[b++] << "t");
           
           
// calculate the price for combination 'a'
           
for(int b = 0; b < c; b++)
            {
                   
int price = 2;
                   
int cc = i[b], tc = i[b]; // current cut
                   
graph[cc] = false;
                   
while(graph[--tc]) price++;
                   
tc = cc;
                   
while(graph[++tc]) price++;
                   
endprice[a] += price;
           
}
           
cout << "nPrice for cut no." << a+1 << " is: " << endprice[a];
           
cout << endl;
       
delete[] graph;
           
next_permutation(i.begin(),i.end());
   
}
   
int mv = endprice[0];
   
for(int a = 1; a < excl; a++)
    {
           
if (endprice[a] < mv)
               
mv = endprice[a];
   
}

   
cout << "The minimum price is: " << mv << endl;
   
delete[] endprice;
   
system("pause");
   
return EXIT_SUCCESS;
}



Ключови думи: c++ задача олимпиада




 За автора: Black`n`White  
I am experienced .NET Application Developer, and also I have worked a lot of time with Borland VCL. Right now I am working on several projects, based on the .NET Platform. Also I am student at the Technical University of Varna
   
 1 посетител чете този скрипт (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

 

 
  • Интересно от Софтуер
 
  • Интересно от myLINKS
 
 
 
 



IT-PLACE.NET © 2004 - 2008