TopCoder SRM625 DIV2

250

简单题

// BEGIN CUT HERE

// END CUT HERE
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef long long ll;

#define clr(x,a) memset(x,a,sizeof(x))
#define sz(x) (int)x.size()
#define pb push_back
#define mp make_pair
#define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i)



class AddMultiply
{
        public:
        vector  makeExpression(int y)
        {
            vector a(3);
            if(y!=4 && y!=5)
                a[2]=y-4,a[0]=2,a[1]=2;
            else
                a[2]=y+4,a[0]=2,a[1]=-2;
            return a;
        }

// BEGIN CUT HERE
	

// END CUT HERE

};
// BEGIN CUT HERE

// END CUT HERE

500

简单题

// BEGIN CUT HERE

// END CUT HERE
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef long long ll;

#define clr(x,a) memset(x,a,sizeof(x))
#define sz(x) (int)x.size()
#define pb push_back
#define mp make_pair
#define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i)



class IncrementingSequence
{
        public:
        bool S[60];
        string canItBeDone(int k, vector  A)
        {
            int i,p;
            int n=sz(A);
            clr(S,0);
            REP(i,n){
                p=A[i];
                while(p<=n){
                    if(!S[p]){
                        S[p]=1;
                        break;
                    }
                    p+=k;
                }
                if(p>n)
                    return "IMPOSSIBLE";
            }
            return "POSSIBLE";
        }

// BEGIN CUT HERE
	
// END CUT HERE

};
// BEGIN CUT HERE

// END CUT HERE


950

模拟?

一群人围成了一个圈,现在给了你一个字符串,这个字符串中只含有三种字符分别是L,H,?,人别代表左边人在说谎,左边的人说的是真话,当前这个人什么都没说。

现在让我们求这堆人里面最少多少人说谎。

首先考虑没有?的情况,只要我们指定第一个人说谎还是没说谎就可以直接求出答案。当当前字符串不符合逻辑前后矛盾时,我们可以用第n-1个人的回答与第0个人的状态来进行判断,如果不符合逻辑则返回-1

当存在问号的时候,我们可以用?将字符串分割成多个子串

例如

LLLHHH??????HHH??LLLL   (不保证逻辑正确,只是为了举例)

此时我们可以利用?将该串分割成两个子串

分别是HHH? 与LLLLLLLHHH?这两个子串,其余的问号我们可以随意指定其说谎还是没说谎,以为要求说谎人数最少的值我们默认这些可以随意指定的?为没说谎。

但是对于紧随在H与L后面的?我们不能随意指定,而是会受到前面的人的影响。

对于一个子串我们只要指定第一个人说谎或者没有说谎接着就可以依次判断每一个的状态,最后取一个最大值(我先求最多多少人没有说谎,所以前面可以随意指定状态的?要先累加到ret中)。最后将所子串的最大值累加到ret中。

求得最多多少人说了真话:ret,我们用n-ret就是最后要求的答案(最少多少人说谎)。

// BEGIN CUT HERE

// END CUT HERE
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef long long ll;

#define clr(x,a) memset(x,a,sizeof(x))
#define sz(x) (int)x.size()
#define pb push_back
#define mp make_pair
#define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i)



class ConundrumReloaded
{
        public:
        int n;
        string ans;
        int Cal(int s,int e,int h,int c){  // h:第一个人是否说真话 c:是否循环
            int i,j,k;
            int pre=h,cnt=h;
            for(i=s;i!=e;i=(i+1)%n){
                if(pre==1&&ans[i]=='H')
                    cnt++,pre=1;
                else if(pre==0&&ans[i]=='L')
                    cnt++,pre=1;
                else
                    pre=0;
            }
            if(c){
                if(h==1&&pre==1&&ans[e]=='L') return -1;
                if(h==1&&pre==0&&ans[e]=='H') return -1;
                if(h==0&&pre==1&&ans[e]=='H') return -1;
                if(h==0&&pre==0&&ans[e]=='L') return -1;
            }
            return cnt;
        }
        int minimumLiars(string answers)
        {
            int i,j,k;
            int ret=0,s;
            n=answers.length();
            ans=answers;
            s=0;
            REP(i,n){
                if(ans[i]=='?'){
                    int p=i;
                    while(p


你可能感兴趣的:(TopCoderSRM)