博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
usaco 17.Jan 铜组T3
阅读量:5010 次
发布时间:2019-06-12

本文共 1352 字,大约阅读时间需要 4 分钟。

  上午在打usaco月赛的铜组题,T1T2是用来秒杀的,然而T3卡了一上午,下面给出题面:

  题意大概就是输入一个N*N的矩阵,矩阵中元素只有0与1两种状态,每次操作以左上角的点为矩阵中某一矩阵的左上方顶点,将该矩阵中所有元素状态改变(即0变为1,1变为0),求将矩阵中元素全部变为0的最小次数。

  第一次看到样例的时候以为就是一道的DFS或BFS的搜索题,然后果断写了DFS,很正常就WA了。然而其实这道题需要用到贪心。。。

  题目中提到,一个矩阵被改变两次之后还是原先的状态,那既然这样,如果将右下角的点留到最后处理的话,有很大可能会重复某次操作,所以每次操作的右下角顶点应该是从右下角开始搜索的,既然这样,每次操作的矩阵应该怎样选取呢?

  因为最后要把所有的元素都变为0,那么最优解其实就是保证每次操作的右下角顶点都为1,并且保证该矩阵中所含1的个数最多。

  那么这样的话策略就已经有了。代码如下: 

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 int sum[11][11],n,ans=0; 8 char a[11][11]; 9 string s[11];10 bool f[11][11];11 int main()12 {13 freopen("cowtip.in","r",stdin);14 freopen("cowtip.out","w",stdout);15 cin>>n;16 for (int i=1;i<=n;i++)17 cin>>s[i];18 for (int i=1;i<=n;i++)19 for (int j=0;j
maxx&&a[i][j]=='1')//查找右下点状态为1且包含状态为1的元素的个数最多的矩阵的右下点40 {41 maxx=sum[i][j];42 x=i; y=j;43 }44 for (int i=1;i<=x;i++)45 {46 for (int j=1;j<=y;j++)47 {48 if (a[i][j]=='1') a[i][j]='0';49 else a[i][j]='1';//将所选取矩阵中所有元素的状态改变50 }51 }52 for (int i=1;i<=n;i++)53 for (int j=1;j<=n;j++)54 sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]-'0';//数据改变后再求矩阵前缀和55 }56 cout<
<
AC代码

 

转载于:https://www.cnblogs.com/hinanawitenshi/p/6286816.html

你可能感兴趣的文章
前端面试题汇总(持续更新...)
查看>>
如何成为F1车手?
查看>>
QT自定义消息
查看>>
Save (Not Permitted) Dialog Box
查看>>
装饰模式(Decorator)
查看>>
任务13:在Core Mvc中使用Options
查看>>
利用Excel 2010数据透视图实现数字的可视化的图形直观展示
查看>>
Sort Colors
查看>>
iview树的修改某个节点,树刷新后自动展开你刚才展开的所有节点
查看>>
oracle服务起不来以及无法监听问题解决
查看>>
Mvc--Html.ActionLink()的用法
查看>>
delphi 基础书籍推荐
查看>>
《面向对象程序设计》2018年春学期寒假及博客作业总结
查看>>
iOS开发UI之KVC(取值/赋值) - KVO (观察某个对象的某个属性的改变)
查看>>
1.7 将一个MxN矩阵所有为0的元素所在行和列全部置0
查看>>
删除U盘时提示无法停止‘通用卷’设备的解决方法!!不要每次都硬拔了,对电脑有不小的损害!!!...
查看>>
Java中接口与接口和类之间的关系
查看>>
芯片TPS70925
查看>>
linux shell 发送email 附件
查看>>
人群密度估计 CrowdCount
查看>>