2017CCPC 秦皇岛现场赛

E题
这个题因为最多就只能增加一个CCPC 所以考虑所有能增加的情况就好了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+50;
char ch[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        scanf("%s",&ch);
        int len = strlen(ch);
        ll ans=0;
        for(int i=0;i<len;i++)
        {
            if(ch[i]=='C'&&ch[i+1]=='C'&&ch[i+2]=='P'&&ch[i+3]=='C')ans++;
        }
        if((ch[0]=='C'&&ch[1]=='P'&&ch[2]=='C')){ans++;}
        else
        {
        for(int i=0;i<len;i++)
        {
            if(ch[i]=='C'&&ch[i+1]=='C'&&ch[i+2]=='C') {

                if(ch[i+3]=='P'&&ch[i+4]=='C')continue;
                else {ans++;break;}
            }
            if(ch[i]=='P'&&ch[i+1]=='C'&&ch[i+2]=='P'&&ch[i+3]=='C'){ans++;break;}
            if(ch[i]=='C'&&ch[i+1]=='C'&&ch[i+2]=='P'&&(ch[i+3]=='P'||i+3>=len)){ans++;break;}
        }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

M 题 因为没有看清楚题目,由于最后没有排序 WA了好多发

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=200+50;
struct point
{
   ll x,y;
   ll dist;
   int idx;
};

point p[maxn];
bool cmp(point a,point b)
{
    return a.dist<b.dist;
}
vector<int>v;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        v.clear();
        ll n,R,r;
        scanf("%lld%lld%lld",&n,&R,&r);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld%lld",&p[i].x,&p[i].y);
            p[i].dist = p[i].x*p[i].x+p[i].y*p[i].y;
            p[i].idx = i;
        }
        sort(p+1,p+1+n,cmp);
        ll sq=0;
        if(R>2*r)
        {

            sq = (ll)(R-r*2)*(ll)(R-r*2);
            for(int i=1;i<=n;i++)
            {
                if(p[i].dist<=sq) v.push_back(p[i].idx);
                else break;
            }
            if(v.size()==0)
            {
                v.push_back(p[1].idx);
                for(int j=2;j<=n;j++)
                {
                    if(p[j].dist==p[1].dist) v.push_back(p[j].idx);
                    else break;
                }
            }
        }
        else if(R<=2*r)
        {
            ll sq2 = (ll)(2*r-R)*(ll)(2*r-R);
            for(int i=1;i<=n;i++)
            {
                if(p[i].dist<=sq2)v.push_back(p[i].idx);
                else break;
            }

            if(v.size()==0)
            {
                v.push_back(p[1].idx);
                for(int j=2;j<=n;j++)
                {
                    if(p[j].dist==p[1].dist) v.push_back(p[j].idx);
                    else break;
                }
            }
        }
        sort(v.begin(),v.end());
        printf("%d\n",v.size());
        for(int i=0;i<v.size();i++)
        {
            if(i!=v.size()-1)
            printf("%d ",v[i]);
            else
            {
                printf("%d\n",v[i]);
            }
        }
    }
    return 0;
}

G题 要使得或的结果最小,就让每一位都尽可能的平均分给某一个二进制位,这样从高到低分配,用java大数处理一下

import java.math.*;
import java.util.*;

public class Main 
{
    public static BigInteger QuickPow02 (int n)
    {
        BigInteger ans = BigInteger.valueOf(1);
        BigInteger base = BigInteger.valueOf(2);
        while(n > 0)
        {
            if(n % 2 == 1)
                ans = ans.multiply(base);
            n /= 2;
            base = base.multiply(base);
        }
        return ans;
    }
    public static BigInteger min (BigInteger a1,BigInteger a2)
    {
        if(a1.compareTo(a2)>=0) return a2;
        else return a1;
    }
    public static void main(String[] args)
    {

        Scanner in = new Scanner(System.in);
        BigInteger n,m,md,bi,s,q,q1,q2;
        int cnt;
        cnt=in.nextInt();
        BigInteger tmp = BigInteger.valueOf(0);
        BigInteger two2 = BigInteger.valueOf(2);
        BigInteger one1 = BigInteger.valueOf(1);
        BigInteger ans=BigInteger.valueOf(0);
        for(int i=1;i<=cnt;i++)
        {
            n = in.nextBigInteger();
            m = in.nextBigInteger();
            s =n.divide(m);
           
            q=n.mod(m);
            q1=n.divide(m);
            //System.out.println(q1);
            int len=0;
            ans=tmp;
            if(!q.equals(tmp))q1=q1.add(one1);
            //System.out.println(q1);
            q2=q1;
            while(!q2.equals(tmp))
            {
            	len++;
            	q2=q2.divide(two2);
            }
            
            //System.out.println(len);
            //System.out.println(q1);
            for(int j=len-1;j>=0;j--)
            {
            	BigInteger t = QuickPow02(j);
            	//System.out.println(t);
            	if(q1.compareTo(t)>=0) {
            		//System.out.println(1);
            		ans=ans.add(t);
            		BigInteger c =min(n.divide(t),m);
            		n = n.subtract(c.multiply(t));
            		q1 = n.divide(m);
            		if(!n.mod(m).equals(tmp)) q1=q1.add(one1);
            	}
            }
            System.out.println(ans);
      
        }
        
    } 

}
全部评论

相关推荐

03-26 15:18
已编辑
华北水利水电大学 Java
点赞 评论 收藏
分享
运营3年修炼中接简历辅导:你的科研项目经历里,只写了你的动作,没有写你的思考和成果,不要只写使用什么进行了什么,这等于罗列你的任务,简历是为了突出你的优秀,你在什么样的任务背景下,克服了什么样的困难,针对性地做了哪些事情,最后达成了什么成果(用数据体现你的成果和效率)
点赞 评论 收藏
分享
05-12 18:24
长安大学 UE4
因为是家里第一代大学生,报专业报学校都没人可以指导,只能自己看着来毕业找工作,父母只知道考公务员啊考教师啊,丝毫不考虑难度我说要去大城市打工才行,小县城对学历没有需求,开的工资都很低,两三千养活不了的结果都不同意我去大城市,觉得北上广深远,不稳定,一年到头不着家,养这么大孩子算白养了要我怎么办,不考公不考编就是死路一条呗,出去打工就是不孝呗可是考公考编也好难,考上也是小职员,到时候又变成了家里第一代体制内了,不还是样样靠自己有时候很羡慕同学,要去大城市打拼,家里都很支持去看看外面的世界也羡慕同学父母都是体制内的,考上还有所依靠家里没有办法给予帮助,简直是进入死胡同一样
Two_Shadow:你先拿到offer,路是自己走的,你真去了谁拦得住你呢,不用给自己扣帽子,我也是我家第一代大学生啊,农村人,高考96个志愿我就填50多个计算机,爸妈让我填满保底我说我不,我就学计算机,上大学了让我考研我说我不考,我就喜欢干活,现在签了offer,他们也释怀,不回家就努力提升自己,就往家里打钱,就开视频,还能怎么样呢,路是自己走的,他们只是希望你能走得好一点,但大部分父母,尤其是农村父母根本帮不了你什么,难道你就不走路了吗,希望能骂醒你,不要想太多做太少。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务