CF514

CF这场比赛赛场上做了三个,交了两个,最后电脑没电了C没有交,第二天交了1A,心态小崩,不过因为之前太水了,这次竟然还加了十几分。

 

A. Cashier

这是个简单的贪心,代码zhao找不到了

B. Forgery

这题是一个暴力,考试时花了一段时间找规律,后来发现只要四周8个是黑色的,就可以不管中间那块的颜色,所以从(2,2)遍历到(n-1,m-1),然后将墨水点和原图比较一下即可

#include<bits/stdc++.h>
using namespace std;


int a[1005][1005],b[1005][1005],n,m,x,y,z,k,l,p,s,ans;
int add[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
char c;

bool pan(int x, int y){
    bool f=1;
    for (int i=0; i<8; i++)
    if (a[x+add[i][0]][y+add[i][1]]==0){
        f=0;
        break;
    }
    return f;
}

void work(int x, int y){
    for (int i=0; i<8; i++)
        b[x+add[i][0]][y+add[i][1]]=1;
}
int main(){
    cin>>n>>m;
    for (int i=1; i<=n; i++)
    for (int j=1; j<=m; j++){
        cin>>c;
        if (c=='#') {
            a[i][j]=1;
            s++;
        }
        else a[i][j]=0;
    }
    for (int i=2; i<=n-1; i++)
        for (int j=2; j<=m-1; j++) if (pan(i,j)) work(i,j);
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++) ans+=b[i][j];
    if (ans==s) cout<<"yes"<<endl;
    else cout<<"no"<<endl;
    return 0;
}

C. Sequence Transformation

这题是一个找规律的题,一开始以为是一道难的数学题有点害怕,后来发现让剩下的公约数最大只需要每次删掉奇数,然后剩下的除以2,然后再删掉奇数,直到删除完为止,那么每次删除的即为ceil(n/2),特别要注意的是如果最后删到n为3,那么最后一个不再是2^k,而是2^(k-1)*3,因为此时1,2,3删除2会使结果最大。

#include<bits/stdc++.h>
using namespace std;


int n,m,x,y,z,k,l;

int main(){
    cin>>n;
    k=1;
    while (n){
        if (n==3){
            cout<<k<<" "<<k<<" "<<k*3;
            break;
        }
        x=(n+1)/2;
        n/=2;
        for (int i=1; i<=x; i++) cout<<k<<" ";
        k*=2;
    }
    return 0;
}

 

D. Nature Reserve

这题是一个二分,属于知识储备足够但是想不到做法的题,二分半径然后公式判断即可,一开始没想到r会很大第四个点wa好几次,还有sqrt必须拆开写,不然精度误差很大,看网上有大佬用三分,回头学习一下

#include<bits/stdc++.h>
using namespace std;

double a[100005][2];
int n,m;
double x,y,z,k,l;

bool pan(double r){
    double z=-1e18;
    double y=1e18;
    for (int i=1; i<=n; i++){
        if (2*r<a[i][1]) return 0;
        z=max(a[i][0]-sqrt(a[i][1])*sqrt(2*r-a[i][1]),z);
        y=min(a[i][0]+sqrt(a[i][1])*sqrt(2*r-a[i][1]),y);
    }
    if (z>y) return 0;
    else return 1;
}
int main(){
    cin>>n;
    for (int i=1; i<=n; i++) cin>>a[i][0]>>a[i][1];
    for (int i=2; i<=n; i++)
    if (a[1][1]*a[i][1]<0){
        cout<<-1<<endl;
        return 0;
    }
    for (int i=1; i<=n; i++) a[i][1]=abs(a[i][1]);
    double l,r=0;
    l=0;
    r=1e16;
    for (int i=1; i<=500; i++){
        double mid=(l+r)/2.0;
        if (pan(mid)) r=mid;
        else l=mid;
    }
    printf("%.10f", r);
    return 0;
}

 

这段汇编代码是一个函数,函数名为phase_6。下面是对每个指令的解释: 1. push %ebx:将寄存器 ebx 的值入栈。 2. sub $0xc, %esp:将栈顶指针 esp 减去 12,为将来的数据预留空间。 3. push $0xa:将整数 10 入栈。 4. push $0x0:将整数 0 入栈。 5. pushl 0x1c(%esp):将栈顶偏移量为 0x1c 的值入栈。 6. call 80489b0 <strtol@plt>:将函数 strtol 的地址入栈,并跳转到该地址处执行函数。 7. mov %eax, %ebx:将函数 strtol 的返回值存入寄存器 ebx。 8. movl $0x804c174, (%esp):将地址为 0x804c174 的值压入栈中。 9. call 8049279 <fun6>:将函数 fun6 的地址入栈,并跳转到该地址处执行函数。 10. mov 0x8(%eax), %eax:将地址为 eax+8 的值存入寄存器 eax。 11. mov 0x8(%eax), %eax:将地址为 eax+8 的值存入寄存器 eax。 12. mov 0x8(%eax), %eax:将地址为 eax+8 的值存入寄存器 eax。 13. mov 0x8(%eax), %eax:将地址为 eax+8 的值存入寄存器 eax。 14. mov 0x8(%eax), %eax:将地址为 eax+8 的值存入寄存器 eax。 15. add $0x10, %esp:将栈顶指针 esp 加上 16。 16. cmp %ebx, (%eax):将寄存器 ebx 的值和地址为 eax 的值进行比较。 17. je 8049312 <phase_6+0x42>:如果比较结果为相等,则跳转到函数的结尾。 18. sub $0xc, %esp:将栈顶指针 esp 减去 12,为将来的数据预留空间。 19. push $0x6:将整数 6 入栈。 20. call 8049868 <explode_bomb>:将函数 explode_bomb 的地址入栈,并跳转到该地址处执行函数。 21. add $0x10, %esp:将栈顶指针 esp 加上 16。 22. add $0x8, %esp:将栈顶指针 esp 加上 8。 23. pop %ebx:将栈顶元素出栈,并存入寄存器 ebx。 24. ret:返回函数调用点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值