Codeforces Round 514 (Div.2)

比赛传送门

熬夜氪肝打\(CF\),好不容易搞出来三道题,TMD\(FST\)
\(\rm{QAQ}\),还是第二道题,死因:数组开小。我什么时候能认真一些啊……

第三道题因为错了太多+做得完,和第二题一个分

不过我竟然涨了4个rating(可能是我太菜了,已经不屑于扣我的\(\tt{rating}\)了)


\(\it{A.Cashier}\)

还是水,不过比上次好些

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int read(){
    int k=0,f=1; char c=getchar();
    for(;c<'0'||c>'9';c=getchar())
      if(c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar())
      k=k*10+c-48;
    return k*f;
}
int ans=0;
int main(){
    int n=read(),l=read(),a=read();
    int x1=0;
    for(int i=1;i<=n;i++){
        int x=read(),y=read();
        ans+=(x-x1)/a;
        x1=x+y;
    }
    ans+=(l-x1)/a;
    cout<<ans;
    return 0;
}

\(\sf{B.Forgery}\)

这题我一开始毫无思路,所以先刚的\(C\)题再回来做的,然后就数组开小了……

我们枚举每一个周围全是\(#\)的元素,然后将它中间的点的坐标入栈。
枚举完毕后,我们新建一张空白图,将坐标依次出栈,在空白图上将它周围的点全变成\(#\),然后与原图比较

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read(){
    int k=0,f=1; char c=getchar();
    for(;c<'0'||c>'9';c=getchar())
      if(c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar())
      k=k*10+c-48;
    return k*f;
}
bool mapp[1010][1010],wmap[1010][1010];
//check枚举每个元素
bool check(int x,int y){
    if(mapp[x+1][y]&&mapp[x+2][y]&&mapp[x][y+1]&&mapp[x][y+2]
        &&mapp[x+1][y+2]&&mapp[x+2][y+2]&&mapp[x+2][y+1])
        return 1;
    else return 0;
}
int wx[1000010],wy[1000010],top;//就是这个地方,数组开小了1000倍……
int fx[9]={0,1,0,-1,0,1,-1,1,-1},
    fy[9]={0,0,1,0,-1,-1,1,1,-1};
int main(){
    int n=read(),m=read();
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++){
          char c; cin>>c;
          if(c=='#') mapp[i][j]=1;
      }
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++){
          if(mapp[i][j]){
              if(check(i,j)) wx[++top]=i+1,wy[top]=j+1;
          }
      }
    //填新图
    while(top){
        int x=wx[top],y=wy[top]; --top;
        for(int i=1;i<=8;i++) wmap[x+fx[i]][y+fy[i]]=1;
    }
    //比较
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        if(mapp[i][j]!=wmap[i][j]){
            cout<<"NO"; exit(0);
        }
    cout<<"YES";
    return 0;
}

\(\tt{C.Sequence\;Transformation}\)

能自己做出\(\mathbb{C}\)题来,还是很开心的。

因为题中要求字典序最大,但开始几次无论我们删哪个数,它们的\(gcd\)肯定都是\(1\),所以我们只要让数列的\(gcd\)尽量早的不为\(1\)就好了,所以我们可以先将奇数删去,这样可以最早的输出一个大于\(1\)的数——\(2\)
以此类推,我们再留下\(4\)的倍数、留下\(8\)的倍数……一直到最接近并小于\(n\)\(2\)的整数次幂。
之后比较麻烦的是最后一位数的判定。如果\(n\)能被\(ans[n-1]\)整除,那为了字典序最大,我们要最后再把\(n\)删去。如果\(n\)不能被\(ans[n-1]\)整除,为了字典序最大,我们要提前删去\(n\),来保证最早输出\(2\)的幂

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long read(){
    long long k=0,f=1; char c=getchar();
    for(;c<'0'||c>'9';c=getchar())
      if(c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar())
      k=k*10+c-48;
    return k*f;
}
long long ans[1000010],hhh=1,pos;
int main(){
    long long n=read(); long long cnt=n;
    if(n==1){
        cout<<"1"; return 0;
    }
    while(cnt){
        long long tot=cnt/2; if(cnt%2) tot++;
        for(long long i=1;i<=tot;i++) ans[++pos]=hhh;
        cnt-=tot; hhh<<=1;
    }
    if(!(n%(ans[n-1]))) ans[n]=n;
    else ans[n]=(ans[n-1]*(n/ans[n-1]));
    for(long long i=1;i<=n;i++) cout<<ans[i]<<" ";
    return 0;
}

转载于:https://www.cnblogs.com/wxl-Ezio/p/9779596.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值