CodeForces contest/776 A+B+C题解

          ICM Technex 2017 and Codeforces Round #400 (Div. 1 +Div.2,combined)         

                                               A. A Serial Killer

 谜一样的题意:每天从两个人里面选一个人杀掉然后另一个人替补,已知每天要杀掉的和代替者和第一天候选的两个人,求每天候选的两个人的名字,顺序任意。

int main()
{
    string a,b,c,d;
    int n;
    cin>>a>>b;
    cin>>n;
    cout<<a<<" "<<b<<endl;
    for(int i=0;i<n;i++)
    {
        cin>>c>>d;
        if(c==a) a=d;
        else if(c==b) b=d;
        else if(d==a) a=c;
        else if(d==b) b=c;
        cout<<a<<" "<<b<<endl;
    }
//    cout<<a<<" "<<b<<endl;
    return 0;
}

 A题看了17分钟才知道了题意,随手一敲AC,然后B题已经过了尽1000个人了。

                                                                B. Sherlock and his girlfriend

  题意:n串项链,每串价格依次从2-n+1。现在要个这些珍珠涂色,要求价格是另一个价格的素因子的两串颜色不能相同。求最多需要多少种颜色k,任意输出颜色c(c>=1&&c<=k)。

  特判一下1和2即可,其他的都是两种情况,我们知道价格一定是连续的,那么超过2,价格至少达到4,所以这时至少需要两个颜色,我们其实可以让所有的素数是一种颜色,其余的是另一种颜色即可,这样3以上只需两种即可。

  讲道理这题水的一比,思路也是秒有,但是一直到结束前7分钟才交上去AC。开始打了个素数表,写着写着突然发现除了1其余的都是2种素数和非素数,却忘了考虑2,当n=2,价格一次为2,3.他们的颜色是可以相等的,于是沙壁似的特判了1然后return,其余的先输出2,再分素数和非素数。然后开C题,题意模模糊糊的时候系统提示被Hacked。于是只能立刻回来继续debug,从开始到现在心烦意乱,我亲爱的CF啊,你为什么要放在这个时间段,你就不能放在傍晚或者凌晨吗,偏偏选在舍友都很活跃的时候,4个人农药开黑,整个宿舍激情回荡。我没法做到心无旁骛,偏偏CF又有点卡,继续交了两发都是跪在Hacked数据上,然后随便输入却发现2的时候输出的种数错了,特判一下直接交页面还没弹出来CF传来no respones。我的那个心急啊,室友依然活跃,我分分钟提刀砍人的冲动你们造吗。down的半个小时终于交上去了,结果得分366,比A题还低100。我是习惯掉分的,可是这样掉分让我很是愤怒啊,啊,啊, ,啊,,啊,。、

void fun()
{
    memset(a,-1,sizeof(a));
    for(int i=2; i<N; i++)
        if(a[i])
        {
            if(N/i<i) continue;
            for(int j=i*i; j<N; j+=i)
                a[j]=0;
        }
}
int main()
{
    fun();
    cout<<k<<endl;
    int n;
    cin>>n;
    if(n==1)
    {
        printf("1\n1\n");
        return 0;
    }
    int ans=1;
    for(int i=1;i<=n;i++)
        if(a[i+1]&&(i+1)<=(n+1)/2)
    {
        ans++;
        break;
    }
    cout<<ans<<endl;
    for(int i=1;i<=n;i++)
        if(a[i+1])
    {
        cout<<"1"<<" ";
    }
    else  cout<<"2"<<" ";
    return 0;
}

 

                                                                   C. Molly's Chemicals

   虽然延迟10分钟,但C题完全没思路,坐以待毙的感觉真是永生难忘啊,一腔怒火无处发泄。。。。感慨了一下ACM真是个好东西,让人激动让人伤心,让人无法自拔,多少人前赴后继。真是刺激,要是大学过的平庸无味未免有些遗憾,它让你淡泊名利,虚心前行,这段经历将会是一笔不错的人生财富。

  好了补上C题。给你一个n和k,然后n个数,求有多少个区间,其和为k的幂。

  不知道这题在完全冷静的状态下能不能做出来,不过感觉差不多。

   我们用sum[i]表示一个前缀和,然后就是求满足 sum[i]-sum[j]=k^t。这个式子其实就是突破口,正向思维我们无法知道到底有多少[i,j]。所以我们可以反向思维,sum[i]=sum[j]+k^t。这样把k的幂全部处理出来然后一次和sum[j]累加即可,每次就是加上q[sum[i]]]。其实就是这么简单,可是在那种情况下我们大多是直接从问题入手正面寻求解答。。。

   要注意的是k为-1和1的情况。。

ll  sum[N],b[N],k;
void init(ll k)
{
    b[0]=1;
    for(int i=1; i<65; i++)
        if(b[i-1]<=INF) b[i]=b[i-1]*k;
}
int main()
{
    int n;
    while(~scanf("%d%I64d",&n,&k))
    {
        sum[0]=0;
        init(k);
        ll x;
        map<ll,ll>q;
        ll ans=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=0; j<65&&b[j]<=INF; j++)
            {
                if(k==1||k==-1)
                {
                    if(k==-1)  q[sum[i-1]-1]++;
                    q[sum[i-1]+1]++;
                    break;
                }
                else q[sum[i-1]+b[j]]++;
            }
            scanf("%I64d",&x);
            sum[i]=sum[i-1]+x;
            ans+=q[sum[i]];
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

   人生啊~~~~~





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值