TopCoder SRM625 DIV2

250

简单题

// BEGIN CUT HERE

// END CUT HERE
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <ctime>
#include <utility>
#include <iterator>

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 <int> makeExpression(int y)
        {
            vector<int> 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 <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <ctime>
#include <utility>
#include <iterator>

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 <int> 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 <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <ctime>
#include <utility>
#include <iterator>

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<n && ans[p]=='?')
                        p++;
                    if(p==n&&i==0) return 0;  // ????.....????
                    if(p==n) s=0;
                    else s=p;
                    break;
                }
            }
            i=s;
            do{
                if(ans[i]=='?') ret++,i=(i+1)%n;
                else{
                    j=(i+1)%n;
                    while(j!=i&&ans[j]!='?') j=(j+1)%n;
                    if(j==i) j=(i-1+n)%n;
                    if(i==0&&j==n-1){
                        ret=max(Cal(i,j,1,1),Cal(i,j,0,1));
                        break;
                    }
                    ret+=max(Cal(i,j,1,0),Cal(i,j,0,0));
                    i=(j+1)%n;
                }
            }while(i!=s);
            if(ret!=-1) ret=n-ret;
            return ret;
        }

// BEGIN CUT HERE
	
// END CUT HERE

};
// BEGIN CUT HERE

// END CUT HERE


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值