CodeForces contest/776 A+B+C题解

来源:互联网 发布:linux查找文件夹 编辑:程序博客网 时间:2024/04/30 13:22

          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
原创粉丝点击