zoukankan      html  css  js  c++  java
  • USACO Broken Necklace

    这么个所谓简单的题目弄了一下午加一晚上,呵呵,怎么也算不对。

    一定会有一个简单的方法。

    晚上去新都回来后,又坐在电脑面前思索这个问题。

    多次删除写出的眼看就要成功的代码,因为不够简洁。

    突然顿悟:

    1.串相联;

    假设数数当前位置为pos;

    2.k[pos]==‘w',不可能是最大。

    3.k[pos+1]=='w',不可能是最大。

    4.k[pos]=k[pos+1],不可能是最大。

    5.pos==0,不能往左数。

    所以,

    6.只有k[pos]!=k[pos+1]才有可能数出最大:

    即'r','b',或'b','r'这种组合才可能最大。

    所以,最后的算法是,找到合适的pos,

    从pos往左数+从pos+1往右数这些组合,找出最大的,呵呵!

    7.看似完美,没有完全通过。呵呵,再来!

    /*
    ID: qq104801
    LANG: C
    TASK: beads.c
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /* for debug only:counter
    */
    void debug_dummy(void)
    {
        return;
    }
    
    int n;
    char k[600];
    
    int count(int pos)
    {
        int index=0;    
        int l=1,r=1;
        if (k[pos]=='w' || k[pos+1]=='w' || k[pos]==k[pos+1] || pos<1)
            return 1;
        index=pos;
    
        while(--index && index>=0)
        {
            if ((k[index]==k[pos]) || (k[index]=='w'))
                l++;
            else
                break;
        }
    
        index=pos+1;
        while(++index && k[index]!='')
        {
            if ((k[index]==k[pos+1]) || (k[index]=='w'))
                r++;
            else
                break;
        }
        //printf("pos:%d  l:%d  r:%d l+r:%d
    ",pos,l,r,l+r);
        return l+r;
    }
    
    void init()
    {
        int i;
        int cc=0;
        char c1,c2;
        c1='';
        i=n-1;    
        while(i++)
        {       
            cc++;
            k[i]=k[i-n];
            if (k[i]!=k[0])
            {
                c1=k[i];
            }
            if (c1!='' && k[i]!=c1)
                break;
        }
        k[++i]='';
        //printf("cc;%d
    ",cc);
        //printf("k:%s
    ",k);
    }
    
    main () {    
        FILE *fin = fopen ("beads.in", "r");
        FILE *fout = fopen ("beads.out", "w");    
        fscanf(fin,"%d",&n);
        fscanf(fin,"%s",&k);  
        //printf("n:%d
    ",n);
        //printf("k:%s
    ",k); 
        init();
        int i;
        int max,t;
        t=0;
        max=0;
        for(i=0;i<n;i++)
        {
            t=count(i);
            if (max<t)
                max=t;
        }
        //printf("max:%d
    ",max);
    
        fprintf(fout,"%d
    ",max);
    
        fclose(fin);
        fclose(fout);
        exit (0);
    }
    /***********************************************

    看书看原版,原汁原味。

    不会英文?没关系,硬着头皮看下去慢慢熟练,才会有真正收获。

    没有原书,也要网上找PDF来看。

    网上的原版资料多了去了,下载东西也到原始下载点去看看。

    你会知其所以然,呵呵。

    ***********************************************/

  • 相关阅读:
    面试题15 链表中倒数第k个结点
    面试题14 调整数组顺序使奇数位于偶数前面
    面试题13 在O(1)时间删除链表结点
    面试题12 打印1到最大的N位数
    面试题11 数值的整数次方
    面试题10 二进制中1的个数
    面试题9 斐波那契数列
    面试题8 旋转数组的最小数字
    关于神经网络训练的一些建议笔记
    两篇将rf和boosting方法用在搜索排序上的paper
  • 原文地址:https://www.cnblogs.com/dpblue/p/3930382.html
Copyright © 2011-2022 走看看