sicily 1140(搜索)

题目链接:sicily 1140

解题思路:贪心+深搜

相当考编程能力的一道题,一个手贱就卡了好几天,不过的确是一到好题。考察的是对贪心法的运用,还有编程能力——深搜。贪心原则是从最小结点开始搜索(这样最小结点就是根结点),然后对于每一个结点,搜索返回结点数最小结点,根据题意比较结果,每次贪心搜索之后删除那条边,并标记整个子图,再继续搜索,直到所有的人都分到遗产。

代码:(有可能冗余很多,但都是测试需要)

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f

using namespace std;

int n,m,cnt,start,end,ans,minx,index_;
int v[30005],sign[30005];
vector<int> vec[30005];

pair<int,int> dfs(int index)
{
    int sum=1,len=vec[index].size(),tmp,tmp_min=index;
    for(int i=0;i<len;i++)
    {
        if(vec[index][i]&&!sign[vec[index][i]]&&!v[vec[index][i]])
        {
            v[vec[index][i]]=1;
            pair<int,int> new_pair=dfs(vec[index][i]);
//          cout<<vec[index][i]<<endl;
            tmp=new_pair.first;
            sum+=tmp;

            int tmp1=cnt-tmp,tmp2=tmp;
            if(tmp1<=tmp2)
            {
                if(tmp1>ans)
                {
//                  cout<<"case1111111111"<<endl;
                    ans=tmp1,minx=index_;
                    start=index,end=vec[index][i];
                }
                else if(tmp1==ans&&minx>index_)
                {
//                  cout<<"case2222222222"<<endl;
                    minx=index_;
                    start=index,end=vec[index][i];
                }
            }
            else
            {
                if(tmp2>ans)
                {
//                  cout<<"case3333333333"<<endl;
                    ans=tmp2,minx=new_pair.second;
                    start=index,end=vec[index][i];
                }
                else if(tmp2==ans&&minx>new_pair.second)
                {
//                  cout<<"case4444444444"<<endl;
                    minx=new_pair.second;
                    start=index,end=vec[index][i];
                }
            }

            tmp_min=min(tmp_min,new_pair.second);
        }
    }
//  cout<<"dfs: "<<sum<<"       index: "<<index<<"  minx: "<<minx<<endl;
//  cout<<start<<" & "<<end<<endl;
    return make_pair(sum,tmp_min);
}

void remove(int index)
{
    int len=vec[index].size();
    for(int i=0;i<len;i++)
        if(vec[index][i]&&!sign[vec[index][i]])
            sign[vec[index][i]]=1,remove(vec[index][i]);
}

int main()
{
    while(~scanf("%d %d",&n,&m))
    {
        memset(sign,0,sizeof(sign));
        memset(vec,0,sizeof(vec));

        int x,y;
        for(int i=1;i<n;i++)
        {
            scanf("%d %d",&x,&y);
            vec[x].push_back(y);
            vec[y].push_back(x);
        }   

        cnt=n,start=-1,end=-1,sign[0]=1;
        for(int i=1;i<m;i++)
        {
            if(cnt==1)
            {
                printf("0 ");
                continue;
            }

            memset(v,0,sizeof(v));
            ans=0,index_=-1,minx=INF;
            for(int j=1;j<=n;j++)
                if(!sign[j]){
                    index_=j;
                    break;
                }

            v[index_]=1;
            int num=dfs(index_).second;
//          cout<<i<<": "<<index_<<endl;
//          cout<<"num: "<<num<<endl;
//          cout<<"!!!!!!!!!!!: "<<start<<" & "<<end<<endl;

            int len=vec[start].size();
            for(int i=0;i<len;i++)
                if(vec[start][i]==end)
                {
                    vec[start][i]=0;
                    break;
                }
            len=vec[end].size();
            for(int i=0;i<len;i++)
                if(vec[end][i]==start)
                {
                    vec[end][i]=0;
                    break;
                }

            sign[minx]=1;
            remove(minx);
            printf("%d ",ans);
            cnt-=ans;
        }
        printf("%d\n",cnt);
    }

    return 0;
}

总结:

1、突然觉得,最难的算法是贪心!

2、回溯法的一个例子原来就是深搜?!(之前一直不知道回溯法是啥……)

时间: 2024-10-12 02:05:44

sicily 1140(搜索)的相关文章

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

sicily 1219(记忆化搜索)

题目链接:sicily 1214 解题思路: 博弈题,用搜索来做.但是,如果用普通的搜索来做的话,是会超时的--复杂度大约是O( n^n ),所以需要采用记忆化搜索的方法(其实差不多就是动态规划了,但是这里是树形DP). 状态: 用集合S表示现在树的状态,i 表示现在轮到谁进行砍边,dp[ S ][ i ]表示最优值.集合S可以用二进制来表示,即001表示现在还剩下第0条边. 状态转移: 1)A的目标是取最大值,B的目标是取最小值,我们在推导当前状态的最优解时,需要分两种情况考虑!即A得维护较大

sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)

DescriptionIn the two-player game "Two Ends", an even number of cards is laid out in a row. On each card, face up, is written a positive integer. Players take turns removing a card from either end of the row and placing the card in their pile. T

sicily 1024 邻接矩阵与深度优先搜索解题

Description There are N cities and N-1 roads in Magic-Island. You can go from one city to any other. One road only connects two cities. One day, The king of magic-island want to visit the island from the capital. No road is visited twice. Do you know

sicily 1050 深度优先搜索解题

1050. Numbers & Letters Constraints Time Limit: 3 secs, Memory Limit: 32 MB Description In the early 80’s, a popular TV show on Dutch television was ‘Cijfers en Letters’ (Numbers and Letters). This game consisted of two game elements, in which the ma

sicily 1071(搜索)

题目链接:sicily 1071 解题思路: 题目要求我们把大的矩形分得尽量小,那么当我们把一个矩形分成两部分之后,自然会想到分出来的这两个矩形还能不能继续划分,这样就很自然地想到了递归.确定了大概思路之后,我们就得来解决细节--如何判定矩形能否被划分? 具体来说是这样做的,以寻找x轴方向划分线为例,首先,把矩形按照x轴坐标进行排序,之后遍历每个矩形,如果矩形的右边界的边为划分线,那么左边所有矩形(包括该矩形)的面积之和必然等于划分之后左边的矩形之和,由此判断. 代码: #include <cs

sicily 1152 简单马周游 深度优先搜索及回溯算法

1152. 简单的马周游问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge Description 在一个5 * 6的棋盘中的某个位置有一只马,如果它走29步正好经过除起点外的其他位置各一次,这样一种走法则称马的周游路线,试设计一个算法,从给定的起点出发,找出它的一条周游路线. 为了便于表示一个棋盘,我们按照从上到下,从左到右对棋盘的方格编号,如下所示: 1     2     3       4    

(转)sicily题目分类

Sicily题目分类 ·         [数据结构/图论] 1310 Right-Heavy Tree   笛卡尔树相关,复杂度O(N)或O(NlogN). ·1426 Phone List         电话号码前缀检索,trie树相关. ·1443 Printer Queue      基本队列操作. ·1149 等价表达式         判断表达式是否等价(递归求解) ·1136 山海经             n长序列里求m次区间询问的最大连续子区间和.线段树/RMQ ·1252

POJ 1351-Number of Locks(记忆化搜索)

Number of Locks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1140   Accepted: 559 Description In certain factory a kind of spring locks is manufactured. There are n slots (1 < n < 17, n is a natural number.) for each lock. The height