POJ 3276

题意:n头牛站成线,有朝前有朝后的的,然后每次可以选择大小为k的区间里的牛全部转向,会有一个最小操作m次使得它们全部面朝前方。问:求最小操作m,再此基础上求k。

题解:1、5000头牛不是小数目,再怎么也得要n^2的算法,其中,枚举k是需要的,这就有n了,只能想办法给出一个n在O(n)时间内求出最小次数了。

   2、对于给定的k,要想O(n)内把次数算出来,即只能扫一遍,一想到的必定是从前往后扫,遇到面朝后的就转头,但这一转牵扯太多,要改太多东西,k一大直接崩溃。

   3、对于每次扫描到的第i个点,都至多只能改一次才能保证效率,即只改变化的。将牛的朝向弄成依赖型,即后者依赖于前者,这样在一个区间内[a,b]翻转时,实际上[a+1,b]的依赖关系是没有改变的,改变的只有a,b+1。

   4、综上,设置一种关系表示每头牛与前一头牛的朝向,最简单的就是同向与反向的差异,不妨令同向为0,反向为1,为了使得最后都朝前,可以令一头虚拟牛(即0号牛)头朝前,然后第一头牛依赖于它。

   5、因此,每次检查时,只需要更改a和a+k位置的牛的依赖关系便可以解决了,最后在检查一下剩余的牛是否全是0就结束了。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <memory.h>
#include <cstring> using namespace std; int N;
char tmp, tmp1;
int arr[];
int arr1[]; int K,M; int test(int k)
{
memcpy(arr1,arr,sizeof(arr));
int time = ;
for(int i=; i<=N-k+; i++)
{
if(arr1[i] == )
{
arr1[i] = ;
arr1[i+k] = abs(arr1[i+k]-);
time++;
}
} for(int i=N-k+; i<=N; i++)
{
if(arr1[i] == )
return ;
}
return time; } void caculate()
{
K = ;
M = N;
int tmpM;
for(int i=; i<=N; i++)
{
tmpM = test(i); if(tmpM> && tmpM<M)
{
M = tmpM;
K = i;
}
} } int main(int argc, char** argv)
{ //freopen("E:/sample_input.txt", "r", stdin); while(scanf("%d",&N)!=EOF)
{
memset(arr, , sizeof(arr));
tmp1 = 'F';
for(int i=; i<=N; i++)
{ scanf(" %c", &tmp);
if(tmp == tmp1)
arr[i] = ;
else
arr[i] = ;
tmp1 = tmp;
} caculate(); cout << K << " " << M << endl; }
return ;
}

最新文章

  1. MYSQL离线安装
  2. 无法解决 equal to 操作中 &quot;SQL_Latin1_General_CP1_CI_AS&quot; 和 &quot;Chinese_PRC_CI_AS&quot;
  3. java使用正则从爬虫爬的txt文档中提取QQ邮箱
  4. [Android] 解析android framework下利用app_process来调用java写的命令及示例
  5. Pyqt QDockWidget 停靠窗体
  6. Yii2-redis
  7. Activator.CreateInstance 反射实例化对象
  8. 第十四篇 Integration Services:项目转换
  9. svn 日志 offline 错误
  10. pstree命令
  11. dl标签和table标签
  12. cxf所用的lib
  13. samba服务器的搭建及使用
  14. tmux 命令
  15. grunt live reload 配置记录
  16. java学习书籍推荐
  17. web前端技术框架选型参考
  18. [笔记]我的Linux入门之路 - 03.Java环境搭建
  19. CSS预编译器less简单用法
  20. 跟着大佬重新入门DP

热门文章

  1. Codeforces Round #303 (Div. 2) D 贪心
  2. bootstrap-3
  3. spark新能优化之数据本地化
  4. P168 实战练习(权限修饰符)
  5. php MySQL数据库操作类源代码
  6. Kali linux渗透测试的艺术 思维导图
  7. C语言中强制数据类型转换(转)
  8. 黑马程序员——JAVA基础之包,权限
  9. “访问 IIS 元数据库失败”错误的解决方法
  10. 【转】关于IE7 z-index问题完美解决方案