hdu 2259

news/2024/11/29 8:46:43/

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2259


题意是找一种策略,可以使这个策略得到值比continuous same game(1) 的策略好1.5倍就可以了。也其实就是不用找最优的策略。。只要稍微比(1)的策略好就行。。。。

我一开始往找最优策略方向了。所以一直超时。。最后被我水过了。


下面是AC代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<queue>
using namespace std;
#define maxn 21
char map[maxn][maxn];
bool vis[maxn][maxn];
bool mark[maxn][maxn];
int n,m;
int greedans;
int dir[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
inline bool cheack(int x,int y){   return x>=0&&x<n&&y>=0&&y<m;  }
void dfs(int x,int y,char color,int &num,char temp_map[maxn][maxn])
{for(int i=0; i<4; i++){int nx=x+dir[i][0],ny=y+dir[i][1];if(cheack(nx,ny)&&!vis[nx][ny]&&temp_map[nx][ny]==color){vis[nx][ny]=true;temp_map[nx][ny]='0';num+=1;dfs(nx,ny,color,num,temp_map);}}
}void move_zero(char map[maxn][maxn])
{vector<char > temp[maxn];int len=0,i,j;for( i=0; i<m; i++){for( j=n-1; j>=0; j--)if(map[j][i]>'0') break;if(j>=0){for(int j=n-1; j>=0; j--){if(map[j][i]>'0')temp[len].push_back(map[j][i]);}for(int j=temp[i].size(); j<n; j++)temp[len].push_back('0');len++;}}for(int i=len; i<m; i++){for(int j=0; j<n; j++)temp[i].push_back('0');}for(int i=0; i<n; i++)for(int j=0; j<m; j++){map[i][j]=temp[j][n-1-i];}
}
struct node{int ans,val,step,s,color[210];int cnt[maxn][maxn];char map[maxn][maxn];int x[30],y[30];bool operator < (const node &a)  const{return val<a.val;}
}s_pos,ans;
void f(node &next){                                //求剩余连通块,并评估char t[maxn][maxn];for(int i=0;i<n;i++) for(int j=0;j<m;j++) {t[i][j]=next.map[i][j];next.cnt[i][j]=0;}memset(vis,false,sizeof(vis));next.s=0;for(int i=0;i<n;i++) for(int j=0;j<m;j++){if(!vis[i][j]&&t[i][j]>'0'){int res=1;  char c=t[i][j];vis[i][j]=true;dfs(i,j,c,res,t);if(res>1){next.color[++next.s]=res;next.cnt[i][j]=1;}}}next.val=next.ans;for(int i=1;i<=next.s;i++) next.val+=(next.color[i]*(next.color[i]-1));
}
void bfs(){int cnt=0;priority_queue<node > q;q.push(s_pos);while(!q.empty()){node now = q.top();  q.pop();if(now.ans>ans.ans) {ans=now; }if(++cnt>=25) break;for(int i=0;i<n;i++) for(int j=0;j<m;j++){char c = now.map[i][j];int is=now.cnt[i][j];if((c-'0')>0&&is){node next = now;next.map[i][j]='0';next.x[next.step]=i;  next.y[next.step]=j; next.step++;int t_val=1;memset(vis,false,sizeof(vis));  vis[i][j]=true;dfs(i,j,c,t_val,next.map);if(t_val==1) continue;next.ans+=t_val*(t_val-1);next.color[c-'0']-=t_val;move_zero(next.map);f(next);q.push(next);}}}printf("%d\n",ans.step);for(int i=0;i<ans.step;i++)printf("%d %d\n",ans.x[i],ans.y[i]);
}
void solve(){memset(s_pos.color,0,sizeof(s_pos.color));s_pos.ans=s_pos.val=ans.ans=greedans=s_pos.step=0;s_pos.s=0;for(int i=0;i<n;i++) for(int j=0;j<m;j++){s_pos.color[map[i][j]-'0']++;    s_pos.map[i][j]=map[i][j];}f(s_pos);bfs();
}
int main()
{while(scanf("%d%d",&n,&m)!=EOF){for(int i=0; i<n; i++)  scanf("%s",map[i]);solve();}return 0;
}



http://www.ppmy.cn/news/535539.html

相关文章

LeetCode 第 29 场双周赛(890/2259,前39.4%)

文章目录 1. 比赛结果2. 题目1. LeetCode 5432. 去掉最低工资和最高工资后的工资平均值 easy2. LeetCode 5433. n 的第 k 个因子 medium3. LeetCode 5434. 删掉一个元素以后全为 1 的最长子数组 medium4. LeetCode 5435. 并行课程 II hard 1. 比赛结果 做出来了3道题。第三题卡…

leetcode:2259. 移除指定数字得到的最大结果

难度&#xff1a;简单 给你一个表示某个正整数的字符串 number 和一个字符 digit 。 从 number 中 恰好 移除 一个 等于 digit 的字符后&#xff0c;找出并返回按 十进制 表示 最大 的结果字符串。生成的测试用例满足 digit 在 number 中出现至少一次。 示例 1&#xff1a; 输入…

【LSSVM回归预测】基于matlab灰狼算法优化最小支持向量机GWO-LSSVM数据预测【含Matlab源码 2259期】

⛄一、灰狼算法优化最小支持向量机GWO-LSSVM简介 1 算法理论 采用灰狼优化算法的最小二乘支持向量机模型预测时,为避免过拟合现象和检验该模型的有效性,将实证部分主要分为:①基于灰狼优化算法的最小二乘支持向量机预测(出现过拟合现象);②经过交叉验证的灰狼优化算法的最小二…

【图像增强】基于matlab量子遗传算法优化beta自适应图像增强【含Matlab源码 2259期】

⛄一、量子遗传算法自适应增强图像 1 图像增强概述 图像增强就是将原来不清楚的图像变得清晰或把我们感兴趣的某些特征强调出来&#xff0c;以改善图像的视觉效果或便于对图像进行其他处理。图像增强技术大致可分为频域法、空域法和模糊处理三大类。其中&#xff0c;频域法是把…

【Java基础学习打卡12】Java入门程序

目录 前言一、Java程序开发运行流程二、Java程序源代码编写三、Java程序源代码编译四、Java程序运行五、Java入门程序问题总结 前言 本文首先介绍Java程序开发运行基础流程&#xff0c;然后先进行程序源代码编写&#xff0c;然后对Java程序代码进行编译&#xff0c;最后要运行…

POJ - 2259 团队队列

题目链接 https://vjudge.net/problem/POJ-2259 题解 在任何时刻&#xff0c;同一个小组的人只要来到了队伍&#xff0c;就会站在一起&#xff0c;所以我们建立一个队列q0存储队伍中所有小组的编号&#xff0c;再为每个小组i建立一个队列qi存储队伍中这个小组的所有成员&…

LeetCode-2259. 移除指定数字得到的最大结果_Python

给你一个表示某个正整数的字符串 number 和一个字符 digit 。 从 number 中 恰好 移除 一个 等于 digit 的字符后&#xff0c;找出并返回按 十进制 表示 最大 的结果字符串。生成的测试用例满足 digit 在 number 中出现至少一次。 示例 1&#xff1a; 输入&#xff1a;numbe…

C++【STL】之priority_queue学习

优先级队列 优先级队列priority_queue也是STL库中容器适配器的一种&#xff0c;常用于进行数据优先级的处理&#xff0c;说到这儿是不是发现有些熟悉&#xff0c;没错它和我们之前讲解的堆本质上就是一个东西&#xff0c;底层都是数组存储的完全二叉树&#xff0c;它在STL库中…