贪心(Ball,HDU 5821)

来源:互联网 发布:力帆租车软件叫什么 编辑:程序博客网 时间:2024/05/18 01:21

又是很多人都做出来了的题目,自己却没有做出来。


主要是思维上的障碍。


一方面自己应该想好了再来写。

确定好时间复杂度,正确性,编码复杂度。有一定把握了再来写代码。

一开始想了个大概,然后开始写,一边写一边想,代码的讨论很复杂,写完后自己的数据过不了,改了很久,然后感觉讨论不清了,然后觉得交一发WA算了。然后交上去TLE,然后发现时间复杂度O(n^3)。

少动键盘吧。


至于思考的话,也没思考得很彻底,就是先尝试了网络流,用流量来控制哪些球走那些路,然后发现没办法控制球的颜色。

m个操作有顺序,所以就考虑dp,但是感觉没什么可以dp的,状态定义都没什么想法。

然后感觉可以模拟。就是按顺序考虑每一个操作,然后找一个贪心的方法安排球。然后就决定讨论。然后就开始边写边想了。

主要考虑了区间是连续的,空间是一维的,这也是网络流没有利用到的细节。发现球只会往一边走,不会走回头路。

所以就讨论各种情况,决定每种颜色的球往哪边走,还是选一个位子定下来。

最后感觉根本讨论不清楚,已经花了大量的时间了。


最不应该的地方就是一边想一边写。

电脑只应该用来实现算法。

思考之类的事情应该用纸和笔来完成。


自己没有独立思考出来,只能事后总结一下。

贪心之类的方法,就算没办法正着思考出来,也可以尝试猜一个方法,然后再验证正确性,特别是这种通过数很多的题目。


思考的话可以优先考虑简单一点的办法,就算想到了一个正确的解法,也应该再思考一下有没有更简单的方法。

有一定把握了,再开始写代码。

多观察题目的特点。比较一下尝试过的方法为什么不行,有哪些特色没有利用到。

没有球的盒子也可以看成是一种特殊颜色的球。


代码

#include<stdio.h>#include<algorithm>using namespace std;const int maxn = 1010;int n,m;int b[maxn];struct Ball{    int val,pos;    bool operator < (const Ball& rhs) const    {        return pos<rhs.pos;    }}BL[maxn];void solve(){    scanf("%d %d",&n,&m);    for(int i=1;i<=n;i++)    {        scanf("%d",&BL[i].val);        BL[i].pos=-1;    }    for(int i=1;i<=n;i++)    {        scanf("%d",b+i);        for(int j=1;j<=n;j++) if(BL[j].val==b[i]&&BL[j].pos==-1)        {            BL[j].pos=i;            break;        }    }    int l,r;    while(m--)    {        scanf("%d %d",&l,&r);        sort(BL+l,BL+r+1);    }    for(int i=1;i<=n;i++) if(BL[i].val!=b[i])    {        puts("No");        return;    }    puts("Yes");}int main(){    int T;    scanf("%d",&T);    while(T--) solve();    return 0;}


原创粉丝点击