A. Cashier
#include<bits/stdc++.h>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=LONG_LONG_MAX;
const ll maxn=1e5+5;
ll n,L,a;
int main(){
scanf("%lld%lld%lld",&n,&L,&a);
int le=0;
int num=0;
int s,h;
for(int i=0;i<n;++i){
scanf("%d%d",&s,&h);
num+=(s-le)/a;
le=s+h;
}
if(L>le){
num+=(L-le)/a;
}
cout<<num<<endl;
return 0;
}
B. Forgery
我是先记录了要填的地方和不能填的地方,然后去把能填的地方全都填起来,最后检查一下 如果还是有的要填的地方还没被填好,那就NO,否则YES
#include<bits/stdc++.h>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=LONG_LONG_MAX;
const ll maxn=1e3+5;
int n,m;
char M[maxn][maxn];
int xx[]={-1,0,1,-1,1,-1, 0, 1};
int yy[]={1 ,1,1, 0,0,-1,-1,-1};
void look(int x,int y){
bool flag1=0,flag2=0;
for(int i=0;i<8;++i){
if(M[x+xx[i]][y+yy[i]]=='.'){
flag2=1;
}
if(M[x+xx[i]][y+yy[i]]=='X'){
flag1=1;
break;
}
}
if(!flag1&&flag2){
for(int i=0;i<8;++i){
M[x+xx[i]][y+yy[i]]='#';
}
}
}
int main(){
scanf("%d%d",&n,&m);
char tt;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
cin>>tt;
if(tt=='#') M[i][j]='.';
else M[i][j]='X';
}
}
if(n<3||m<3) cout<<"NO"<<endl;
else{
for(int i=1;i<n-1;++i){
for(int j=1;j<m-1;++j){
look(i, j);
}
}
bool flag=0;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(M[i][j]=='.'){
flag=1;
break;
}
}
}
if(flag){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
return 0;
}
C. Sequence Transformation
一段连续数的最大公约数是1,所以第一步肯定是要把1先删除,要不然最大公约数不可能超过1,接下来最想让他出现的最大公约数是2(因为是字典序),所有偶数都可以被2整除,而一串奇数的最大公约数就是1了(除了n==3这种情况,特判一下),很明显接下来的就是将奇数全部删除,而剩下的偶数每次将间隔的删去,公约数就会乘2(比如2 4 6 8 10,删除2 6 10)
#include<bits/stdc++.h>
#include<limits.h>
using namespace std;
typedef long long ll;
const ll INF=LONG_LONG_MAX;
//const ll maxn=1e5+5;
using namespace std;
int n,res=1;
int main(){
scanf("%d",&n);
while(n){
if(n==3){
printf("%d %d %d",res,res,res*3);
return 0;
}
for(int i=1;i<=n/2+n%2;++i) printf("%d ",res);
n/=2;
res*=2;
}
return 0;
}