您的位置:首页 > 其它

hihoCoder太阁最新面经算法竞赛2

2016-05-31 21:18 253 查看
[b]A 任务分配[/b]

描述

给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, EN ), 计算最少需要多少台机器才能按时完成所有任务。

同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行。任务切换不需要时间。

输入

第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目。 以下 N 行每行两个整数 Si, Ei,(0 ≤ Si < Ei ≤ 1000000000),表示任务的起至时间。

输出

输出一个整数,表示最少的机器数目。

题解:线段树(区间更新,离散化)

代码:

/*二进制小数*/
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;

int ans[100000];
int s[150];
int rear;
int flag=1;

int muti()
{
for(int i=2;i<=rear;i++)
s[i]*=2;
for(int i=rear;i>=2;i--)
{
if(s[i]>=10)
{
s[i-1]++;
s[i]%=10;
}
}
for(rear=140;rear>=1;rear--)
{
if(s[rear]==0)    continue;
else    break;
}
if(rear!=1&&s[rear]!=5)
flag=0;
}

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
char S[150];
memset(S,0,sizeof(S));
scanf("%s",S);
memset(s,0,sizeof(s));
int len=strlen(S);
for(int i=2;i<len;i++)
s[i]=S[i]-'0';
memset(ans,0,sizeof(ans));
len=1;
flag=1;
rear=strlen(S)-1;
while(1)
{
muti();
if(flag==0)    break;
ans[len++]=s[1];
s[1]=0;
if(rear==1)    break;
}
if(flag==0)
printf("NO\n");
else
{
printf("0.");
for(int i=1;i<len;i++)
printf("%d",ans[i]);
printf("\n");
}
memset(S,0,sizeof(S));
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: