经典c程序(0028)---最长假期

    /**************************************************************************************     
    * Function     : 最长假期 
    * Create Date  : 2014/05/16   
    * Author       : NTSK13     
    * Email        : beijiwei@qq.com     
    * Copyright    : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。     
    *                任何单位和个人不经本人允许不得用于商业用途     
    * Version      : V0.1                        
                          
    题目: 经典c程序(0028)---最长假期 
     
        有位学生利用100天的假期在一个超市打工,这份工作要求是在100天中按照超市给出的工作日去打工。  
    其中可以有2天的工作日可以换成休息日(但是指定的特勤日不能换成休息日) 
    这位学生想利用其中的休息日到欧洲旅行,为了使旅行的时间尽量长,需要知道将哪2天的工作日换成休息日。 
    请编写一个程序如何将这位学生工作日中的2天换成休息日后使他的旅行时间最长。 
     
    假设这位学生的打工时间是17天,如果以下是他的工作日程表: 
     
      1   0     0     1    0    0   1    0    1    2    0     0    0   2    0    0    0 
    工作 休息 休息    工作 休息 休息 工作 休息 工作 特勤 休息 休息 休息 特勤 休息 休息 休息 
     
    如果按照以下的安排。将第四天和第七天的工作日换成休息日的话,一共可以连续休息7天。 
    (如果将特勤的2天换成休息日的话可以连续休息8天,但是注意: 特勤日是无法换成休息日,只能用工作日调整哦) 
    于是得到下表所示的休息计划: 一共可以连续休息7天 
     
      1   0     0     1          0    0   1           0    1    2    0     0    0   2    0    0    0 
    工作 休息 休息    工作->休息 休息 休息 工作->休息 休息 工作 特勤 休息 休息 休息 特勤 休息 休息 休息 
                       
    [构建 函数] 
    int test_main(int data[100]);  
     
    int data[100] : 100天的工作安排日程表 
    0 = 休息日  
    1 = 工作日  
    2 = 特勤 (无法换成休息日) 
    return : 返回通过调整可以得到的”最长休息日”天数。 
     
    **************************************************************************************/          
    #include<stdio.h>   
    #include <stdio.h>  
    #include <stdlib.h>  
      
    #define SIZE 100  
      
    static int data[SIZE];  
      
    typedef struct method  
    {  
        int x;  
        int y;  
        int len;  
    }Met;  
      
    Met way;  
      
      
    int test(int data[SIZE]);  
      
      
    static void build_data(void)  
    {  
        int c = 0;  
        for ( c = 0; c < SIZE; c++)  
        {  
            data[c] = rand() % 6;  
      
            if (data[c] > 2)   
                data[c] = 0;  
        }  
    }  
      
      
    void main(void)  
    {  
        int l = 0;  
        for ( l = 0; l < 10; l++)  
        {  
            build_data();  
      
            printf("%d\n\n\n", test(data));  
        }  
    }  
      
    int test(int data[SIZE])  
    {  
        int i=0,j=0,x=0,y=0,len=0,ret=0;  
        int flag=0,k=0;  
        Met stack[SIZE];  
        //int data[17]={1,0,0,1,0,0,1,0,1,2,0,0,0,2,0,0,0};// for debug  
        while(i<SIZE)  
        {  
            if(data[i]==2)  
            {  
                i++;  
                continue;  
            }  
            for(j=i,flag=0,len=0;j<SIZE;j++)  
            {  
                if(flag==2 && data[j]==1)  
                    break;  
                if( flag !=2 && data[j]==1)  
                {  
                    if(flag==0)  
                        x=j;  
                    else  
                        y=j;  
                    flag++;  
                }  
      
                if( data[j]==2)  
                {  
                    flag=0;  
                    break;  
                }  
                len++;  
            }  
            stack[k++].x=x;  
            stack[k].y=y;  
            stack[k].len=len;  
            if(ret<len)  
                ret=len;  
            i++;  
        }  
      
        for(k=0;k<SIZE;k++)  
        {  
            if(stack[k].len==ret)  
            {  
                printf("先把第%d个工作日变成节假日\n",stack[k].x);  
                printf("再把第%d个工作日变成节假日\n",stack[k].y);  
                printf("done !!!\n");  
                break;  
            }  
        }  
      
        return ret;  
    }  

 

posted on 2014-05-22 14:10  NTSK13  阅读(162)  评论(0编辑  收藏  举报

导航