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;
}