Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct {
  5.     int inizio;
  6.     int fine;
  7. } att_t;
  8.  
  9. att_t *acquisizione(int *n);
  10. void BubbleSort(att_t *attV, int n);
  11. int duration(att_t att);
  12. void solve(att_t *attV,int n);
  13. int notIntersection(att_t current_att, att_t prev_att);
  14. void displaySol(int *opt,att_t *attV,int n);
  15.  
  16. int main() {
  17.     att_t *vett_Att;
  18.     int n;
  19.  
  20.     vett_Att = acquisizione(&n);            /*Creazione vettore di activities*/
  21.     BubbleSort(vett_Att,n);
  22.     solve(vett_Att,n);
  23.     free(vett_Att);
  24.     return 0;
  25. }
  26.  
  27. att_t *acquisizione(int *n) {
  28.     att_t *vett_AttTMP;
  29.     FILE *fp;
  30.     int i;
  31.     fp = fopen("activity.txt", "r");
  32.     if (fp == NULL) {
  33.         printf("Errore file\n");
  34.         exit(EXIT_FAILURE);
  35.     }
  36.     fscanf(fp, "%d", n);
  37.     vett_AttTMP = malloc((*n+1) * sizeof(att_t));
  38.     vett_AttTMP[0].inizio=0;
  39.     vett_AttTMP[0].fine=0;
  40.     for (i = 1; i <= *n; i++) {
  41.         fscanf(fp, "%d %d", &vett_AttTMP[i].inizio, &vett_AttTMP[i].fine);
  42.     }
  43.     return vett_AttTMP;
  44. }
  45. void BubbleSort(att_t *attV, int n){
  46.     int i,j;
  47.     int l=0,r=n-1;
  48.     att_t tmp;
  49.     for(i=l;i<r;i++){
  50.         for(j=0;j<r-i+l;j++){
  51.             if(attV[j].inizio > attV[j + 1].inizio){
  52.                 /*scambio le celle*/
  53.                 tmp.inizio=attV[j].inizio;
  54.                 tmp.fine=attV[j].fine;
  55.                 attV[j].inizio=attV[j + 1].inizio;
  56.                 attV[j].fine=attV[j + 1].fine;
  57.                 attV[j + 1].inizio=tmp.inizio;
  58.                 attV[j + 1].fine=tmp.fine;
  59.             }
  60.         }
  61.     }
  62. }
  63. int duration(att_t att){
  64.     return (att.fine-att.inizio);
  65. }
  66.  
  67. void solve(att_t *attV,int n){
  68.     int i;
  69.     int *opt;
  70.     opt=calloc(n+1, sizeof(int));
  71.     opt[1]=duration(attV[1]);
  72.     for(i=2;i<=n;i++){
  73.         if(opt[i-1] > opt[i-2]+duration(attV[i]) ){
  74.             opt[i] = opt[i-1];
  75.         } else if (opt[i-2]+duration(attV[i]) > opt[i-1] && notIntersection(attV[i],attV[i-2])){
  76.             opt[i]=opt[i-2]+duration(attV[i]);
  77.         }
  78.     }
  79.     printf("Dynamic Programming solution: max activities duration is %d\n",opt[n]);
  80.     displaySol(opt,attV,n);
  81.     free(opt);
  82. }
  83. int notIntersection(att_t current_att, att_t prev_att){
  84.     if(current_att.inizio<prev_att.fine){
  85.         /*C'è intersezione*/
  86.         return 0;
  87.     }
  88.     return 1;
  89. }
  90. void displaySol(int *opt,att_t *attV,int n){
  91.     int i,*sol;
  92.     sol=calloc(n+1, sizeof(int));
  93.     sol[1]=1;
  94.     i=n;
  95.     while (i>=2){
  96.         if(opt[i]==opt[i-1]){
  97.             sol[i]=0;
  98.             i--;
  99.         }
  100.         else if(opt[i]==opt[i-2]+duration(attV[i])){
  101.             sol[i]=1;
  102.             sol[i-1]=0;
  103.             i-=2;
  104.         }
  105.     }
  106.     for(i=0;i<=n;i++){
  107.         printf("Activity %d: %d\n",i,sol[i]);
  108.     }
  109.     for(i=1;i<n+1;i++){
  110.         if(sol[i]){
  111.             printf("(%2d,%2d)\n",attV[i].inizio,attV[i].fine);
  112.         }
  113.     }
  114.     free(sol);
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement