A:暴力找每个间隔能休息几次。注意首尾。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=1e5+10;
int res,n,L,a,t[N],l[N];
signed main(){
cin>>n>>L>>a;
for(int i=1;i<=n;i++) cin>>t[i]>>l[i];
for(int i=1;i<=n;i++){
res+=(t[i]-t[i-1]-l[i-1])/a;
}
res+=(L-t[n]-l[n])/a;
cout<<res;
return 0;
}
B:枚举每个点,能涂就涂,最后判断是不是一样即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=1e3+10;
const int dx[]={0,1,1,1,0,-1,-1,-1},dy[]={1,1,0,-1,-1,-1,0,1};
int n,m,flag; char a[N][N],b[N][N];
inline int check(int x,int y){
for(int k=0;k<8;k++) if(a[x+dx[k]][y+dy[k]]!='#') return 0;
return 1;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
for(int i=2;i<n;i++){
for(int j=2;j<m;j++) if(check(i,j)){
for(int k=0;k<8;k++) b[i+dx[k]][j+dy[k]]='#';
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) if(a[i][j]=='#'&&b[i][j]!='#') flag=1;
}
puts(flag?"NO":"YES");
return 0;
}
C:删掉的数字为,先删奇数,然后2的倍数非4的倍数,然后4的倍数非8的倍数。
注意只有三个数字的情况。一定是 k k 3*k。
删数字可以set当中实现。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
int n,k=1; set<int> s;
signed main(){
cin>>n;
if(n<4){
for(int i=1;i<n;i++) printf("1 "); printf("%d\n",n); return 0;
}
for(int i=1;i<=n;i++) s.insert(i);
while(n>0){
vector<int> v;
if(n==3){printf("%d %d %d\n",k,k,k*3); return 0;}
for(auto x:s){
if(__gcd(x,k<<1)==k) v.push_back(x);
}
for(int i=0;i<v.size();i++) s.erase(v[i]),printf("%d ",k);
n-=v.size(); k<<=1;
}
return 0;
}
D:首先二分半径,然后我们可以发现可能的圆,构成了一条直线。然后对于每个点,我们可以找到一个区间,所以就是判断区间是否有交集。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const int N=1e5+10;
const double eps=1e-8;
long double x[N],y[N],l,r=1e18,mi=1e9,mx; int n,cnt; set<int> s;
inline int check(double mid){
long double cl=-1e18,cr=1e18;
for(int i=1;i<=n;i++){
if(y[i]>2*mid) return 0;
long double p=sqrt(2.0*y[i]*mid-y[i]*y[i]);
long double ql=x[i]-p,qr=x[i]+p;
cl=max(cl,ql),cr=min(qr,cr);
if(cl>cr) return 0;
}
return 1;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i],mi=min(mi,y[i]),mx=max(mx,y[i]);
if(fabs(y[i])<eps) cnt++; s.insert((int)(x[i]));
y[i]=fabs(y[i]);
}
if((mx>0&&mi<0)||cnt>1) return puts("-1"),0;
if(s.size()==1){
long double mx=-1e18;
for(int i=1;i<=n;i++) mx=max(mx,y[i]);
return printf("%.10Lf\n",mx/2),0;
}
for(int i=1;i<=150;i++){
long double mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid;
}
printf("%.10Lf\n",l);
return 0;
}