贪心算法 1050 2037
2016-08-31 本文已影响21人
碧影江白
1050 Moving Tables
题目大意:
题意:在一个长走廊里搬桌子,走廊的两侧都是房间,把桌子从一个房间搬到另外一个房间,走廊的宽度只能允许一个桌子通过,每次搬桌子需要10分钟(每一次允许再不交叉的走廊中同时搬桌子),问最少多长时间搬完。
思路:
不需要研究每次的前后房间号码,而可以简单地每次都根据房间号码在相应的数组内做出累加,得到的最大数目即为最长的时间。
如图:有四个桌子要搬:
重叠累加后的效果如图:
最大的参数是3,那么也就是说最大的时间是3*10。
依次类推,只要得到1~200单位的每一个使用次数便可:
#include <stdio.h>
#include <string.h>
void main()
{
int A[201];
int i,j,k,n,m;
int a,b;
scanf("%d",&n);
while (n--)
{
memset(A,0,sizeof (A));
scanf("%d",&m);
while (m--)
{
scanf("%d%d",&a,&b);
if (a>b)
{
k=a;a=b;b=k;
}
if (a%2==1)
a=(a+1)/2;
else
a=a/2;
if (b%2==1)
b=(b+1)/2;
else
b=b/2;
for (i=a;i<=b;i++)
A[i]++;
}
int max=A[0];
for (i=1;i<200;i++)
{
if(A[i]>max)
max=A[i];
}
printf ("%d\n",max*10);
}
}
2037
今年暑假不AC
已知每个节目的开始时间和结束时间,求解每天能看到的最多电视节目个数:求最多个数,那么就是取尽量多节目时间短的,且在空闲的时间范围内选择。而方法则在于在已知当前的时间的情况下,找出最短结束时间的节目,该节目的结束时间可以更新为当前时间,继续寻找。
#include <stdio.h>
#include <string.h>
void main()
{
int A[201];
int i,j,k,n,m;
int a,b;
scanf("%d",&n);
while (n--)
{
memset(A,0,sizeof (A));
scanf("%d",&m);
while (m--)
{
scanf("%d%d",&a,&b);
if (a>b)
{
k=a;a=b;b=k;
}
if (a%2==1)
a=(a+1)/2;
else
a=a/2;
if (b%2==1)
b=(b+1)/2;
else
b=b/2;
for (i=a;i<=b;i++)
A[i]++;
}
int max=A[0];
for (i=1;i<200;i++)
{
if(A[i]>max)
max=A[i];
}
printf ("%d\n",max*10);
}
}