65,176
社区成员




// 时间段杖举
enum EnTimeSeg
{
EnFirstSeg,
EnSecondSeg,
EnThirdSeg,
EnFourthSeg,
EnFifthSeg
};
// 每个时间段的数据,其实可以直接用int 数组就OK了
struct STRU_SegInfo
{
EnTimeSeg enSeg;
int nMaxPerson;
};
struct STRU_SegInfo[5];
STRU_SegInfo[0].enSeg = EnFirstSeg, STRU_SegInfo[0].nMaxPerson = 0;
STRU_SegInfo[1].enSeg = EnSecondSeg, STRU_SegInfo[1].nMaxPerson = 0;
STRU_SegInfo[2].enSeg = EnThirdSeg, STRU_SegInfo[2].nMaxPerson = 0;
STRU_SegInfo[3].enSeg = EnFourthSeg, STRU_SegInfo[3].nMaxPerson = 0;
STRU_SegInfo[4].enSeg = EnFifthSeg, STRU_SegInfo[4].nMaxPerson = 0;
// 用死循环处理这个东西很不好
while (1)
{
enum EnTimeSeg enCurSeg;
// 求得当前时间为哪个段
// ... enCurSeg = ...;
static int nCurPerson = 0;
if (/*有人进*/)
{
++nCurPerson;
}
else // 有人出
--nCurPerson;
switch (enCurSeg)
{
case EnFirstSeg:
if (STRU_SegInfo[0].nMaxPerson < nCurPerson)
STRU_SegInfo[0].nMaxPerson = nCurPerson;
break;
case EnSecondSeg:
if (STRU_SegInfo[1].nMaxPerson < nCurPerson)
STRU_SegInfo[1].nMaxPerson = nCurPerson;
break;
case EnThirdSeg:
if (STRU_SegInfo[2].nMaxPerson < nCurPerson)
STRU_SegInfo[2].nMaxPerson = nCurPerson;
break;
case EnFourthSeg:
if (STRU_SegInfo[3].nMaxPerson < nCurPerson)
STRU_SegInfo[3].nMaxPerson = nCurPerson;
break;
case EnFirstSeg:
if (STRU_SegInfo[4].nMaxPerson < nCurPerson)
STRU_SegInfo[4].nMaxPerson = nCurPerson;
break;
default:
break;
}
}
//假设会议从开始到结束共S分钟,会议过程中随时可以有人加入,也随时可以有人退出,进入和退出的时间均有记录,
//现将会议分成X段,求每段内最多在一起开会的人数。
//例如有个会议125分钟,分成了0~30,31~60,61~90,91~120,120~125这五段,即30,60,90,120这四个分割点,
//第一人3分钟进来,50分钟退出,
//第二人4分钟进来,一直到会议结束,
//第三人7分钟进来,20分钟退出,
//第四人15分钟进来80分钟退出,
//第五人25分钟进来,一直开到最后,
//那么每段内最多同时在开会的人数为:
//0~30,4人,
//31~60,4人,
//61~90,3人,
//91~120,2人,
//120~125,2人。
#include <stdio.h>
static char d[5][125];
int h[5][2]={
{ 3, 50},
{ 4,124},
{ 7, 20},
{ 15, 80},
{ 25,124},
};
int g[5][2]={
{ 0, 30},
{ 31, 60},
{ 61, 90},
{ 91,120},
{120,124},
};
int i,j,k,m,m1;
int main() {
for (i=0;i<5;i++) {
for (j=h[i][0];j<=h[i][1];j++) d[i][j]=1;
}
for (k=0;k<5;k++) {
printf("%d~%d,",g[k][0],g[k][1]);
m1=0;
for (j=g[k][0];j<=g[k][1];j++) {
m=0;
for (i=0;i<5;i++) {
m+=d[i][j];
}
if (m>m1) m1=m;
}
printf("%d\n",m1);
}
return 0;
}
//0~30,4
//31~60,4
//61~90,3
//91~120,2
//120~124,2
//
// 时间段杖举
enum EnTimeSeg
{
EnFirstSeg,
EnSecondSeg,
EnThirdSeg,
EnFourthSeg,
EnFifthSeg
};
// 每个时间段的数据,其实可以直接用int 数组就OK了
struct STRU_SegInfo
{
EnTimeSeg enSeg;
int nMaxPerson;
};
struct STRU_SegInfo[5];
STRU_SegInfo[0].enSeg = EnFirstSeg, STRU_SegInfo[0].nMaxPerson = 0;
STRU_SegInfo[1].enSeg = EnSecondSeg, STRU_SegInfo[1].nMaxPerson = 0;
STRU_SegInfo[2].enSeg = EnThirdSeg, STRU_SegInfo[2].nMaxPerson = 0;
STRU_SegInfo[3].enSeg = EnFourthSeg, STRU_SegInfo[3].nMaxPerson = 0;
STRU_SegInfo[4].enSeg = EnFifthSeg, STRU_SegInfo[4].nMaxPerson = 0;
// 用死循环处理这个东西很不好
while (1)
{
// 判断有人进还是有人出
{
// 获取当前时间,判断属性哪个时间段
// 如果是有人出则将当前时间段下nMaxPerson 减一
// 如果是有人进则将当前时间段下nMaxPerson 加一
}
}
#include <stdio.h>
int max_sub_sum(int *a , int n)
{
int max_sofar = a[0];
int max_with_i = a[0];
int i;
for(i=1;i<n;i++)
{
max_with_i = max_with_i<0?a[i]:max_with_i+a[i];
max_sofar = max_sofar>max_with_i?max_sofar:max_with_i;
}
return max_sofar;
}
int main()
{
int a[]={-31,-41,-59,-26,53,-58,97,93,-23,-84,-23,-44,-56};
int max_sub;
max_sub = max_sub_sum(a,sizeof(a)/sizeof(int));
printf("%d\n",max_sub);
return 0;
}
不是只出现就算,比方说一个会议室,里面最多同时的人数,而不是只进过就算 [quote=引用 1 楼 truelance 的回复:] 每个时间段的人数是怎么统计的, 只要在这个时间段出现就算? 在这个时间段结束时在场? 还是超过50%时间在场?
不是只出现就算,比方说一个会议室,里面最多同时的人数,而不是只进过就算 每个时间段的人数是怎么统计的, 只要在这个时间段出现就算? 在这个时间段结束时在场? 还是超过50%时间在场?
每个时间段的人数是怎么统计的, 只要在这个时间段出现就算? 在这个时间段结束时在场? 还是超过50%时间在场?