博弈题,当面临结果为(0,0)时为失败,用二维数组 a[i][j]表示其中i为第一堆石头的数量,j为第二堆石头的数量,再枚举s和k找出必胜的状态。用bool数组节省时间ios::sync_with_stdio(0); cin.tie(0);加快cin,或者直接用scanf。
#include<bits/stdc++.h>
using namespace std;
bool a[5001][5001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
for(int i=0;i<=5000;i++){
for(int j=0;j<=5000;j++){
if(a[i][j]==0){
for(int k=1;k+i<=5000;k++){
for(int s=0;s*k+j<=5000;s++){
a[i+k][j+s*k]=1;
}
}
for(int k=1;k+j<=5000;k++){
for(int s=0;s*k+i<=5000;s++){
a[i+s*k][j+k]=1;
}
}
}
}
}
int t,n,m;
cin>>t;
while(t--){
cin>>n>>m;
if(a[n][m]==0)cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
}
return 0;
}
找几何规律
用到相似三角形和勾股定理,当圆的直径大于b时圆掉落
#include<bits/stdc++.h>
using namespace std;
const int N =2e3+5;
int main(){
double r,a,b,h;
cin>>r>>a>>b>>h;
if(2*r<b)cout<<"Drop"<< endl;
else {
cout<<"Stuck"<<endl;
double c=b*h/(a - b);
double d=2*c*r/b;
double cnt=sqrt(pow(d,2)+pow(r,2))-c;
printf("%.10lf",cnt);
}
return 0;
}
D-Determine the Photo Position
看每一行有几个连续的空位,大于等于老师的人数时就可以放下,每多一个空位那么情况就多一种
注意输入要用%1d
#include<bits/stdc++.h>
using namespace std;
int a[2005][2005];char b[2005];
int main(){
int n,m;cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%1d",&a[i][j]);
cin>>b;
int cnt=0,flag=0;
for(int i=0;i<n;i++){
cnt=0;
for(int j=0;j<n;j++){
if(a[i][j]==0)cnt++;
else if(a[i][j]==1)cnt=0;
if(cnt>=m)flag++;
}
}cout<<flag<<endl;
return 0;
}
100以后的每个数字都与三有关,所以只需要判断100前面的数字就好啦
#include<bits/stdc++.h>
using namespace std;
long long ste(long long x){
if(x>=100)return x-24;
long long sum=0;
for(int i=1;i<=x;i++){
if(i%3==0)sum++;
else if((i%10)%3==0||(i/10!=0&&(i/10)%3==0))sum++;
}return sum;
}
int main(){
int t;cin>>t;
while(t--){
long long l,r;cin>>l>>r;
cout<<ste(r)-ste(l-1)<<endl;
}return 0;
}