码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3276 Face The Right Way(翻转,羁绊?)

时间:2017-10-01 09:55:01      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:break   div   cal   cout   har   翻转   是的   ios   stream   

题目链接:http://poj.org/problem?id=3276

题意:要把n头奶牛翻转成都朝前的,可以翻转k区间长度内的奶牛,求需要的最少操作数和该操作数下对应的区间k。

题解:以羁绊的角度来理解,如果第X头奶牛和它前一个奶牛的朝向相同,那么我们假设他们的羁绊就为0,否则为1。

羁绊为1时,代表第X头奶牛开始的k区间奶牛要翻转一下朝向,那么第X+k头奶牛和它前面的奶牛羁绊要改变,一次for,更新,

就可以得到答案了,最后再判断一下区间长度不够而不能翻转的最后几头奶牛是不是同一个朝向的,不是的话,这个k就不成立。

PS:参考Physcal大佬博客

 1 #include <string>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int N=5555;
 8 int now[N],cow[N];
 9 const int INF=0x3f3f3f3f;
10 
11 int main(){
12     memset(cow,0,sizeof(cow));
13     int n,ansk,ansm;
14     char last=F,tmp;
15     cin>>n;
16     for(int i=1;i<=n;i++){
17         cin>>tmp;
18         if(tmp!=last) cow[i]=1;
19         last=tmp;
20     }
21     for(int k=1;k<=n;k++){
22         int cnt=0;
23         memcpy(now,cow,sizeof(cow));
24         for(int i=1;i+k<=n+1;i++){
25             if(now[i]==1) {cnt++;now[i+k]^=1;}
26          }
27          for(int i=n-k+2;i<=n;i++){
28              if(now[i]==1) {cnt=INF;break;}
29          }
30          if(cnt<ansm) {ansm=cnt;ansk=k;}
31     }
32     cout<<ansk<<" "<<ansm<<endl;
33     return 0;
34 }

 

POJ 3276 Face The Right Way(翻转,羁绊?)

标签:break   div   cal   cout   har   翻转   是的   ios   stream   

原文地址:http://www.cnblogs.com/Leonard-/p/7616561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!