CODE FESTIVAL 2017 qual C- A-B-C 总结

题目链接:点击打开链接

题目A,B,C;

比赛当时只做出了三道题,下来之后想补D题,但是想了很久都不明白。唉

题目A: 签到

#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;



int main(){
    string s;
    string t="AC";
    cin>>s;
    if(s.find(t)!=-1) printf("Yes\n");
    else printf("No\n");
	return 0;
}

题目B:暴力

我的想法是,先考虑两个数a,b的情况。

如果a是奇数,那么相邻的两个数就是偶数,同理,如果a是偶数,那么相邻的两个数就是奇数。

只有奇数*奇数=奇数。剩下三种情况相乘之后都是偶数。

比如样例1:2,3

那么就是 2odd+1even   2even+1odd  相乘之后奇数的个数 odd=2*1=2   even=3*3-odd=7;

如果n=3,那么先把前两个算出来,比如 n=3: 2 3 3;前两个数算完之后就 是 odd=2 even=7     在和后面的3  2even+1odd 计算即可,这样推下去就行。暴力,记得开long long 

#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int c[27][27]={0};
void play_table(void)
{
    for(int i=0;i<=26;i++)
        for(int j=0;j<=i;j++)
            if(!j || i==j)
                c[i][j]=1;
            else
                c[i][j]=c[i-1][j-1]+c[i-1][j];
    c[0][0]=0;
    return;
}
bool f[15];
int e[15],o[15];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        if(x&1) f[i]=true;//odd 1
        else f[i]=false;// even  0
        if(f[i]){
            e[i]=2;
            o[i]=1;
        }else{
            e[i]=1;
            o[i]=2;
        }
    }
    int ans;
    int even=0,odd=0;
    /*
    cure=e[1]*e[2]+e[1]*o[2]+o[1]*e[2];
    curo=(e[1]+o[1])*(e[2]+o[2])-cure;
    */
    odd=o[1]*o[2];
    even=(o[1]+e[1])*(o[2]+e[2])-odd;

    //printf("cure=%d,curo=%d\n",cure,curo);
    for(int i=2;i<n;i++){
            int tmp=odd;
        odd=odd*o[i+1];
        even=(tmp+even)*(o[i+1]+e[i+1])-odd;
            /*
            cure=cure*e[i+1]+curo*e[i+1]+cure*o[i+1];
        curo=(cure+curo)*(e[i+1]+o[i+1])-cure;
         printf("cure=%d,curo=%d\n",cure,curo);
            */

    }
    if(n==1){
        if(f[1]) printf("0\n");
        else printf("1\n");
    }else{
        printf("%d\n",even);

    }


	return 0;
}

C题:模拟一下。

首先考虑把所有的X去掉,如果剩下的串是不是回文串,那么不论怎么往字符串里面增加X都不可能凑成回文串。

当去掉X之后的串是回文串之后,我们再处理。

设置两个指针,head tail 头指针与尾指针

如果扫到的两个字符都是X 那么head+1 tail-1 

如果扫到的两个字符只有一个是X 另外一个不是X 比如 xaxba  下标从0-4 head=0 tail=4  s[head]='X' s[tail]='a'  我们应该在tail 后面加一个X,变成 xaxbax 对吧,那么我们模拟这个过程,head+1 ,tail不动,ans+1;

不存在扫到两个不为‘X’的字符并且字符不等。就这样模拟就行啦。

#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int main(){
    string s,t;
    cin>>s;
    t=s;
    for(int i=s.length()-1;i>=0;i--){
        if(s[i]=='x'){
            t.erase(t.begin()+i);
        }
    }
    //cout<<t<<endl;
    bool p=true;
    int len=t.length();
    for(int i=0;i<=(len/2);i++){
        if(t[i]!=t[len-1-i]){
            p=false;
            break;
        }
    }
    if(!p) printf("-1\n");
    else{
        int ans=0;
        int head=0,tail=s.length()-1;
        for(int i=0;i<s.length();i++){
                if(tail<=head) break;
            if(s[head]!=s[tail]){
                if(s[head]=='x'){
                    head++;
                    ans++;
                }else if(s[tail]=='x'){
                    tail--;
                    ans++;
                }
            }else if(s[head]==s[tail]){
                tail--;
                head++;
            }
        }
        printf("%d\n",ans);
    }

	return 0;
}

能力有限,卡在了D,还是没看明白……。后面的题目也就没看了。
继续加油。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值