zoukankan      html  css  js  c++  java
  • USACO1.1 Broken Necklace

    很简单的模拟题,但是noip的奶酪20分后我觉得模拟题也是需要认真考量的。

    写这题的时候,我的目标是一次A过,想了一些些特殊情况,真的找出了bug。

    一个字符串(3<=长度<=350),选择两个字符中间的位置作为起点,向左右分别计数相同字符的个数,左右累加为答案。求最大答案。

    共3种字符,其中'w'可表示任意字符。

    本题,一定有解,且最小解为2.

    #include<iostream>
    using namespace std;
    
    char x[400];
    int n,ans;
    
    void fix(int &x)
    {
    	if(x==-1)
    		x=n-1;
    	else if(x==n)
    		x=0;
    }
    
    void sch(int l)
    {
    	int r=l+1;fix(r);
    	char lc=x[l],rc=x[r];
    	int cnt=0;
    	while(lc=='w' or x[l]==lc or x[l]=='w')
    	{	
    		if(cnt==n)
    			break;
    		cnt++,
    		lc=(lc=='w'?x[l]:lc),
    		l--,fix(l);
    	}
    	while(rc=='w' or x[r]==rc or x[r]=='w')
    	{	
    		if(cnt==n)
    			break;
    		cnt++,
    		rc=(rc=='w'?x[r]:rc),
    		r++,fix(r);
    	}
    	ans=max(ans,cnt);
    }
    
    int main()
    {
    	ios::sync_with_stdio(0);
    	cin>>n;
    	for(int i=0;i<n;i++)
    		cin>>x[i];
    	for(int i=0;i<n;i++)
    		sch(i);
    	cout<<ans;
    	return 0;
    }
    

    特殊情况

    字符串全是'w'。答案为n,需要特判退出。

    交第一次就过啦,加上之前写的,uasco1已经写完。

  • 相关阅读:
    [JLOI2015] 管道连接
    【知识点】斯坦纳树
    [ZJOI2010] 网络扩容
    【知识点】网络流常见模型
    [NOI2009] 植物大战僵尸
    [NOI2007] 货币兑换
    【知识点】分治相关算法
    [NOI2005] 月下柠檬树
    [HNOI2012] 射箭
    [SDOI2014] 向量集
  • 原文地址:https://www.cnblogs.com/syhien/p/8092675.html
Copyright © 2011-2022 走看看