HDU1050(贪心)

题目大意:给你400个房间,每个房间标号,一条栈道的上面全是奇数,下面全是偶数,每十分钟内每个位置的两个房间中间的栈道只能同行1次,问把这n条桌子从不同房间放到另一个房间中至少要几分钟。

解题思路:刚开始相当的思路是模拟数组,每次标记,结果WA,后来果断改变思路。觉得可能是类似于贪心或者动态规划的题,每个时间段搬桌子一定是越多越好,这样n条桌子才能更早地搬完。若何考虑每个时间段搬更多的桌子呢?你可以联想成一条布,你要减成更多条规格不同的布,怎么减得更多呢?即这些不同规格的布的头部的位置和尾部的位置要更靠近。我们用一个结构体保存每次的头和尾(即从一个房间搬到另一个),把信息预处理完排序,使得头部更紧密,然后就是“每一条长度相同的布减成规格不同的布”,即每次处理这些桌子。处理完后记得把本条信息标记,下次发现有标记的就不用减了。最后看看需要“几条这样长度相同的布”就是需要几个10分钟;看到别的大犇吧每次经过的栈道次数做记录(在本位置+1),然后最后看看那个位置的记录最大即经过次数最多,这个最大值就是answer。orz。(ps:预处理时要注意开头的房间比尾部的房间号数小

WA代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

void cmp(int *a,int *b)
{
	if(*a>*b)
	{
		int temp=*a;
		*a=*b;
		*b=temp;
	}
	if(*a&1==0)
		*a=*a-1;
	if(*b&1==1)
		*b=*b+1;
	return ;
}

int main()
{
	int n,t,i,j,a[401],data[200][2],tx,ty,cnt;
	cin>>t;
	while(t--)
	{
		cin>>n;
		cnt=10;
		memset(a,0,sizeof(a));
		for(i=0;i<n;i++)
			cin>>data[i][0]>>data[i][1];
		for(i=0;i<n;i++)
		{
			tx=data[i][0];
			ty=data[i][1];
			cmp(&tx,&ty);
			for(j=tx;j<=ty;j++)
			{
				if(a[j]==0)
				{
					a[j]=1;
				}
				else
				{
					cnt+=10;
					memset(a,0,sizeof(a));
					i--;
					break;
				}
			}
		}
		cout<<cnt<<endl;
	}
	return 0;
}
贪心AC:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct node
{
    int head,tail,flag;
}road[200];

int cmp(node a,node b)
{
    return a.head<b.head;
}

void swap(int *a,int *b)
{
	int temp=*a;
	*a=*b;
	*b=temp;
	return ;
}

int main()
{
    int t,i,j,n,tail,cnt;
    cin>>t;
    while(t--)
    {
        cin>>n;
        cnt=0;
        for(i=0;i<n;i++)
        {
            cin>>road[i].head>>road[i].tail;
            //预处理, 把房间号对应到门前的栈道号
            road[i].head=(road[i].head+1)/2;
            road[i].tail=(road[i].tail+1)/2;
	    if(road[i].head>road[i].tail)
		swap(&road[i].head,&road[i].tail);
            road[i].flag=0;
        }
        sort(road,road+n,cmp);  //使得头位置靠近,每一次能够装下得区间数更多
        for(i=0;i<n;i++)
        {
            if(!road[i].flag)
            {
                road[i].flag=1;
                tail=road[i].tail;
                for(j=i+1;j<n;j++)
                {
                    if(!road[j].flag && road[j].head>tail)  //本条信息没被用过并且合法
                    {
                        road[j].flag=1;
                        tail=road[j].tail;
                    }
                }
                cnt++;
            }
        }
        cout<<cnt*10<<endl;
    }
    return 0;
}


大犇AC代码:
    #include"cstdio"  
    #include"algorithm"  
    using namespace std;  
    int main()  
    {  
        int T;  
        scanf("%d",&T);  
        while(T--)  
        {  
            int n;  
            scanf("%d",&n);  
            int ans=0;  
            int zc[400]={0};  
            for(int j=0;j<n;j++)  
            {  
                int x,y;  
                scanf("%d%d",&x,&y);  
                if(x%2==0)  
                    x--;  
                if(y%2==0)  
                    y--;  
                int p=min(x,y);  
                int q=max(x,y);  
                for(int i=p;i<=q;i++)  
                    {  
                        zc[i]++;  
                        if(ans<zc[i])  
                            ans=zc[i];  
                    }  
            }  
            printf("%d\n",ans*10);  
        }  
        return 0;  
    }  

大犇思路: 点击打开链接
全部评论

相关推荐

03-19 09:58
河海大学 Java
最喜欢春天的奇亚籽很...:同学,是小红书不是小哄书,一眼就能看到的错误
投了多少份简历才上岸
点赞 评论 收藏
分享
自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务