zoukankan      html  css  js  c++  java
  • poj 3276(反转开灯问题)

    • 题意:在一排上有N头牛,有的超前有的朝后,有台机器每次可以旋转k头牛,可以旋转m次。k,m尽量小的情况下,使所有的牛面朝前。
    • 用搜索做的话容易超时,复杂度 2^N.
    1. 交换区间反转的顺序对结果没有影响;
    2. 对同一个区间进行两次以上的反转是多余的;
    
    //从左边起,询问牛的面朝方向,B进行反转操作,F不进行反转操作
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    char ch;
    int dd[5005],f[5005],sum;
    int slove(int k)
    {
        //'0'表示'B';
        //'1'表示'F';
        memset(f,0,sizeof(f));
        int sum=0,cnt=0;//sum记录当前i,其前面k-1个反转多少次。
        for(int i=0; i+k<=n; i++)
        {
            if(i-k>=0)
                sum-=f[i-k];
            if(dd[i]==0 && sum%2==0)//如果这个位置本来是朝后的,那么经过偶数次反转之后方向还是朝后的,需要再次反转
            {
                f[i]=1;
                sum+=f[i];
                cnt++;
            }
            if(dd[i]==1 && sum%2==1)//如果这个位置本来是朝前的,那么经过奇数次反转之后方向是朝前的,需要再次反转
            {
                f[i]=1;
                sum+=f[i];
                cnt++;
            }
        }
       // printf("%d %d
    
    ",k,cnt);
       
    
       //询问后面k-1有牛是不是面朝前。
        for(int i=n-k+1; i<n; i++)
        {
            if(i-k>=0)
            {
                sum-=f[i-k];
            }
            if(dd[i]==0&&sum%2==0) return -1;
            else if(dd[i]==1&& sum%2==1) return -1;
        }
        return  cnt;
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=0; i<n; i++)
            {
                cin>>ch;
                if(ch=='B')
                     dd[i]=0;
                else if(ch=='F')
                    dd[i]=1;
            }
            int k=1,sum=n;
            for(int i=1; i<=n; i++)
            {
                if(slove(i)==-1) continue;
                else if(sum>slove(i)) k=i,sum=slove(i);
            }
            printf("%d %d
    ",k,sum);
        }
        return 0;
    }
    
  • 相关阅读:
    Oracle startup startup nomount startup mount 的区别
    Linux 查看磁盘是否为SSD
    Spark入门实战系列--4.Spark运行架构
    Hbase 的java 增删改查操作
    Hbase 的一些重要网站链接,有空没空的搂两眼
    一段生成大数据测试数据的java code 片段
    一段简单的java 代码,用于日期格式转化
    一个简单的jsp 页面
    Scala 版 word count
    db2expln 查看执行plan
  • 原文地址:https://www.cnblogs.com/zzulipomelo/p/4858088.html
Copyright © 2011-2022 走看看