CodeForces 680A&680B&680C&680D Round#356

昨天晚上实在是=_=困。。。(浪了一天)就没有去打Codeforces
中午醒来看看题,还不太难。
A题:模拟(水题 3minAC)

// by Sirius_Ren
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[6],sum=0,ans;
bool cmp(int a,int b){return a>b;}
int main()
{
    for(int i=1;i<=5;i++)scanf("%d",&a[i]),sum+=a[i];
    ans=sum;
    sort(a+1,a+6,cmp);
    for(int i=1;i<=5;i++)
        for(int j=1;j<=2;j++){
            if(a[i]!=a[i+j])break;
            ans=min(ans,sum-a[i]-a[i]);
            if(j==2)ans=min(ans,sum-a[i]-a[i]-a[i]);
        }
    printf("%d",ans);
}

这里写图片描述
B:(水题 5minAC)

// by Sirius_Ren
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,a,ans=0;
bool v[105];
int main(){
    scanf("%d%d",&n,&a);
    for(int i=1;i<=n;i++)scanf("%d",&v[i]);
    for(int i=0;i<=n;i++){
        if(a-i>0&&a+i<=n&&v[a-i]&&v[a+i]&&i)ans+=2;
        else if(a-i>0&&a+i<=n&&v[a-i]&&v[a+i]&&!i)ans++;
        else if(a-i<=0&&a+i<=n&&v[a+i])ans++;
        else if(a-i>0&&a+i>n&&v[a-i])ans++;
    }
    printf("%d",ans);
}

这里写图片描述
C:一道数学题。
枚举50以内的素数,最后判断有没有i*i(i^2<50)的即可。
一个yes—>素数
否则—->合数

// by Sirius_Ren
#include <cstdio>
#include <iostream>
using namespace std;
int a[20]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,4,8,9,25,49},ans=0;
char s[20][5];
int main()
{
    for(int i=0;i<20;i++){printf("%d
",a[i]);fflush(stdout);scanf("%s",s[i]);}
    for(int i=0;i<20;i++)if(s[i][0]=='y')ans++;
    if(ans>=2)printf("composite
");
    else printf("prime
");
}

(呃其实没有“8”,当时多打了一个,不过也没关系,AC就是王道)
这里写图片描述
D:
http://www.cnblogs.com/macinchang/p/5572070.html
照着他的题解写得。 没有什么思路。。。。
这里写图片描述

// by Sirius_Ren
#include <cstdio>
#include <algorithm>
using namespace std;
long long a;
long long p(long long x){return x*x*x;}
pair<int,long long>b;
void w(long long x,int y,long long z){
    if(!x){b=max(b,make_pair(y,z));return;}
    long long t=1;
    while(p(t+1)<=x)++t;
    w(x-p(t),y+1,z+p(t));
    if(x)w(p(t)-1-p(t-1),y+1,z+p(t-1));
}
int main(){
    scanf("%I64d",&a),w(a,0,0);
    printf("%d %I64d",b.first,b.second);
}

这里写图片描述
E:第10个点WA了,并不知道怎么改。 大数据挂了。。。

// by Sirius_Ren
#include <set>
#include <queue>
#include <cstdio>
#include <algorithm>
#define ff(aa,bb,cc,dd) for(int i=aa;i<=bb;i++)for(int j=cc;j<=dd;j++)
#define f(aa,bb) for(int i=aa;i<=bb;i++)
using namespace std;
set<int>s;
queue<int>que;
set<int>::iterator it;
int n,k,tot=0,jy,vis[501][501],v[500000],q[500000],ans=0,Q=0;
char xx[]={1,-1,0,0},yy[]={0,0,1,-1},a[501][501];
void Dfs(int x,int y){
    jy++,vis[x][y]=tot;
    f(0,3)if(!vis[x+xx[i]][y+yy[i]]&&a[x+xx[i]][y+yy[i]]=='.')Dfs(x+xx[i],y+yy[i]);
}
void dfs(int x,int y)
{
    while(!que.empty())s.erase(que.front()),que.pop();
    for(int i=0;i<k;i++)
        if(vis[x+i][y-1])
        {
            q[vis[x+i][y-1]]--;
            if(!q[vis[x+i][y-1]])s.erase(vis[x+i][y-1]);
        }
        else if(a[x+i][y-1]=='X')jy--;
    for(int i=0;i<k;i++)
        if(vis[x+i][y+k-1])
        {
            if(!q[vis[x+i][y+k-1]])s.insert(vis[x+i][y+k-1]);
            q[vis[x+i][y+k-1]]++;
        }
        else if(a[x+i][y+k-1]=='X')jy++;
    for(int i=0;i<k;i++)if(vis[x-1][y+i]&&s.find(vis[x-1][y+i])==s.end())s.insert(vis[x-1][y+i]),que.push(vis[x-1][y+i]);
    for(int i=0;i<k;i++)if(vis[x+k][y+i]&&s.find(vis[x+k][y+i])==s.end())s.insert(vis[x+k][y+i]),que.push(vis[x+k][y+i]);
    for(int i=0;i<k;i++)if(vis[x+i][y-1]&&s.find(vis[x+i][y-1])==s.end())s.insert(vis[x+i][y-1]),que.push(vis[x+i][y-1]);
    for(int i=0;i<k;i++)if(vis[x+i][y+k]&&s.find(vis[x+i][y+k])==s.end())s.insert(vis[x+i][y+k]),que.push(vis[x+i][y+k]);
    int temp=jy;
    for(it=s.begin();it!=s.end();it++)temp+=v[*it];
    ans=max(ans,temp);
    if(y+k<=n)dfs(x,y+1);
    for(int i=0;i<k;i++)
        if(vis[x+i][y-1])
        {
            if(!q[vis[x][i-1]])s.insert(vis[x][i-1]);
            q[vis[x][i-1]]++;
        }
        else if(a[x+i][y-1]=='X')jy++;
    for(int i=0;i<k;i++)
        if(vis[x+i][y+k-1])
        {
            q[vis[x+i][y+k-1]]--;
            if(!q[vis[x+i][y+k-1]])s.erase(vis[x+i][y+k-1]);
        }
        else if(a[x+i][y+k-1]=='X')jy--;
    if(x+k<=n&&y==1)
    {
        for(int i=1;i<k;i++)
        {
            if(vis[x][i])
            {
                q[vis[x][i]]--;
                if(!q[vis[x][i]])s.erase(vis[x][i]);
            }
            else if(a[x][i]=='X')jy--;
        }
        for(int i=1;i<k;i++)
        {
            if(vis[x+k][i])
            {
                q[vis[x+k][i]]++;
            }
            else if(a[x+k][i]=='X')jy++;
        }
        dfs(x+1,1);
    }
}
int main(){
    scanf("%d%d",&n,&k);
    ff(1,n,0,n)scanf("%c",&a[i][j]);
    ff(1,n,1,n)if(!vis[i][j]&&a[i][j]=='.')jy=0,tot++,Dfs(i,j),v[tot]=jy;
    jy=0;
    ff(1,k,1,k-1)
        if(a[i][j]=='X')jy++;
        else{
            if(!q[vis[i][j]])s.insert(vis[i][j]);
            q[vis[i][j]]++;
        }
    dfs(1,1);
    printf("%d",ans);
}

这里写图片描述
E题已挂。

原文地址:https://www.cnblogs.com/SiriusRen/p/6532443.html