AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int n;
cin>>n;
string s;
cin>>s;
bool flag=true;
for(int i=0;i<n-1;i++){
if(s[i]=='M'&&s[i+1]=='M'||s[i]=='F'&&s[i+1]=='F'){
flag=false;
break;
}
}
if(flag) puts("Yes");
else puts("No");
return 0;
}
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=10;
char s[N][N];
char dx[9]={'0','a','b','c','d','e','f','g','h'};
int main()
{
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
cin>>s[i][j];
}
}
int ix=1,iy=1;
bool flag=true;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(s[i][j]=='*'){
ix=i;
iy=j;
flag=false;
break;
}
}
if(!flag) break;
}
cout<<dx[iy]<<8-ix+1<<endl;
return 0;
}
如果纯按照题意模拟的话,会超时,其实只要标记好有哪些数,然后遍历所有数,如果加上x后的数是有的,那么就Yes,否则No
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
signed main()
{
int n,x;
cin>>n>>x;
set<int>s;
for(int i=1;i<=n;i++){
cin>>a[i];
s.insert(a[i]);
}
bool st=false;
for(int i=1;i<=n;i++){
if(s.count(a[i]+x)){
st=true;
break;
}
}
if(st) puts("Yes");
else puts("No");
return 0;
}
题意是给定两个正整数N和M,然后在[1,N]之间选取两个数a,b(a可等于b),x等于a和b的乘积,求x的最小值(其中x大于等于M),如果不存在x,则输出-1
先单独判断特殊情况,如果N*N小于M,那么输出-1(因为N*N可能会超long long,所以改为N小于sqrt(M))
不妨设a小于等于b,然后从1到n遍历作为a的值,而b的值则取M/a向上取整
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
using namespace std;
signed main()
{
int n,m;
cin>>n>>m;
if(n<sqrt(m)){
cout<<-1<<endl;
return 0;
}
int res=1e12+10;
for(int i=1;i<=n;i++){
int x;
if(m%i==0) x=m/i;
else x=m/i+1;
if(x<=n) res=min(res,i*x);
if(i>x) break;
}
cout<<res<<endl;
return 0;
}