当前位置: 代码迷 >> 综合 >> 贪心算法 poj 1083 (C语言)
  详细解决方案

贪心算法 poj 1083 (C语言)

热度:99   发布时间:2023-12-01 02:19:31.0

同一时间段同时工作问题

可以类比木棍问题,本题坑比较多

1.输入数据要判断哪个是起点,哪个是终点

2.排序时要按照起点排序 (有特殊情况)

1

4

2 4

1 6

10 12

5 14

终点排序结果是30,起点是20

3.注意终点的奇偶性,奇数与其+1共用一段走廊,判断时候要考虑终点是奇数还是偶数

就是你每次要尽可能的同时进行多次工作,直到完成所有工作

AC代码:

#include <stdio.h>
#define N 201
typedef struct Locate
{int from;int to;int visit;
}Loc;
Loc loc[N];
void quick_Sort(Loc p[],int left,int right)
{int i=left,j=right;int pivot=p[(i+j)/2].from;Loc temp;while (i<=j){while(p[i].from<pivot){i++;}while (p[j].from>pivot){j--;}if (i<=j){temp=p[i];p[i]=p[j];p[j]=temp;i++;j--;}}if(left<j)  quick_Sort(p,left,j);if(i<right) quick_Sort(p,i,right);
}
int find(int n)
{int sum=0,temp=0;for(int i=1;i<=n;i++){if(loc[i].visit==0){temp=i;sum++;                              //sum代表你能你经历了几次循环loc[i].visit=1;for(int j=1;j<=n;j++){if(loc[j].visit==0&&((loc[temp].to%2==1&&loc[j].from>loc[temp].to+1)||(loc[temp].to%2==0&&loc[j].from>loc[temp].to))) //可以同时移动(不要忘了考虑终点的奇偶性吖){temp=j;loc[j].visit=1;}}}}return sum*10;
}
int main()
{int T,n;int from,to;scanf("%d",&T);while (T--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d %d",&from,&to);loc[i].from=from<to?from:to;loc[i].to=from>to?from:to;loc[i].visit=0;}if(n==1){printf("10\n");continue;}quick_Sort(loc,1,n);printf("%d\n",find(n));}return 0;
}
//  poj 1083