标签: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