1 条题解

  • -1
    @ 2024-9-18 21:06:30

    十分简单好吧

    #include <cstdio>
    #include <climits>
    #include <cstring>
    #define MAXN 105
    using namespace std;
    
    int a[MAXN][MAXN];
    bool vis[MAXN];
    int n, i, j;
    bool flag;
    bool finish;
    
    void dfs(int pos, int hp)
    {
    	if (pos == n && hp > 0)
    	{
    		flag = false;
    		finish = true;
    		return ;
    	}
    	else if (pos == n && hp <= 0)
    	{
    		flag = true;
    		return ;
    	}
    	if (hp <= 0)
    	{
    		flag = true;
    		return ;
    	}
    	if (hp > 20000)
    	{
    		flag = false;
    		return ;
    	}
    	for (int i = 1; i <= n; i++)
    	{
    		if (!vis[i] && a[pos][i] != 0 && !finish)
    		{
    			vis[i] = true;
    			dfs(i, hp * 2 + a[pos][i]);
    			vis[i] = false;
    		}
    	}
    }
    
    int work()
    {
    	int left = -1, right = 20000, middle;
    	while (left + 1 != right)
    	{
    		memset(vis, false, sizeof(vis));
    		middle = left + (right - left) / 2;
    		finish = false;
    		flag = false;
    		dfs(1, middle);
    		if (flag) left = middle;
    		else right = middle;
    	}
    	return right;
    }
    
    int main()
    {
    	scanf("%d", &n);
    	for (i = 1; i <= n; i++)
    		for (j = 1; j <= n; j++)
    			scanf("%d", &a[i][j]);
    	printf("%d\n", work());
            while(1)//防抄袭
    	return 0;
    }
    
  • 1

信息

ID
285
时间
1000ms
内存
256MiB
难度
9
标签
(无)
递交数
161
已通过
15
上传者