题目链接:UVA - 11039
题意描述:建筑师设计房子有两条要求:第一,每一层楼的大小一定比此层楼以上的房子尺寸要大;第二,用蓝色和红色为建筑染色,每相邻的两层楼不能染同一种颜色。现在给出楼层数量和每层楼的尺寸(楼层尺寸的大小没有按照顺序给出),求出满足这样要求的最大楼层数。
算法分析:把楼层尺寸按照从大到小排序,然后遍历一次的同时记录相邻楼层所染颜色不同,把不满足要求的楼层去掉即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #define inf 0x7fffffff 8 using namespace std; 9 const int maxn=500000+10; 10 11 int n,an[maxn]; 12 13 int cmp(int i,int j) 14 { 15 i=abs(i) ;j=abs(j) ; 16 return i>j; 17 } 18 19 int main() 20 { 21 int t;scanf("%d",&t); 22 while (t--) 23 { 24 scanf("%d",&n); 25 for (int i=0 ;i<n ;i++) scanf("%d",&an[i]); 26 sort(an,an+n,cmp); 27 int cnt=1,flag= an[0]>0 ? 1 : -1 ; 28 for (int i=1 ;i<n ;) 29 { 30 int f= an[i]>0 ? 1 : -1 ; 31 while (f==flag && i<n) 32 { 33 i++; 34 f= an[i]>0 ? 1 : -1 ; 35 } 36 if (f != flag && i<n) 37 { 38 cnt ++ ; 39 flag=f; 40 i ++ ; 41 } 42 } 43 printf("%d\n",cnt); 44 } 45 return 0; 46 }
时间: 2024-10-05 05:58:19