1.小红的字符串大小写变换
直接按照题意模拟就可以,将大小写互转
#include<bits/stdc++.h>
using namespace std;
int n,k;
string s;
void change(int i,int w)
{
if(w==0)
{
if(s[i]>='a'&&s[i]<='z') s[i]=s[i]-'a'+'A';
}
else
{
if(s[i]>='A'&&s[i]<='Z') s[i]=s[i]-'A'+'a';
}
}
int main()
{
cin>>n>>k>>s;
for(int i=0;i<n;++i)
{if(i<k) change(i,0);
else change(i,1);
}
cout<<s;
}
2.小红杀怪
数据较小,由于怪物血量小于20,故而每种类型的攻击最多20次,枚举所有可能,选择最小的。
#include<bits/stdc++.h>
using namespace std;
int a,b,x,y,ans;
int main()
{
cin>>a>>b>>x>>y;
ans=INF;
for(int i=0;i<=40;++i)
for(int j=0;j<=40;++j) //使用x
for(int w=0;w<=40;++w)
if(a-w*y-i*x<=0&&b-w*y-j*x<=0)
ans=min(ans,i+j+w);
cout<<ans;
}
3.小红的元素分裂
动态规划,首先依照题意预处理处所有数字可以被拆分成若干个1的最小次数,随后将题目所给出的所有数字累加即可。
#include<bits/stdc++.h>
using namespace std;
#define maxx 200000
int n,m,ans;
int dp[maxx];
int all[maxx];
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
{cin>>all[i];
m=max(m,all[i]);
}
dp[1]=0;
for(int i=2;i<=m;++i)
{dp[i]=dp[i-1]+1;
for(int j=2;j<=sqrt(i);++j)
if(i%j==0)
dp[i]=min(dp[i],dp[i/j]+dp[j]+1);
}
for(int i=1;i<=n;++i)
ans=ans+dp[all[i]];
cout<<ans;
}
注意转移方程,在寻找倍数时,可以采用根号下寻找,也可以采用筛法一次性预处理出所有数字的倍数,后者时间复杂度为O(nlnn),优于前者O(nsqrt(n)),或者采取更好的寻找倍数的算法。
4.小红的扫雷游戏
数据较小,可以搜索,可以依此枚举每个格子是否为雷,然后判断是否合法,可以进行适当的可行性剪枝。
另外注意判断每个格子是否唯一,可以在所有合法情况下记录每个格子的值,如果一个格子在所有合法情况都是雷,那么它一定是雷,如果都不是雷,那么它一定不是雷,剩下的未知。
同时注意在枚举的时候不必枚举已经有数字的区域,复杂度O(n*n*2^n*n),n取4.
另外,如果测试点1和5过不去,有可能是没有考虑扫过雷的区域是0的情况。
#include<bits/stdc++.h>
using namespace std;
int all[10][10];
int all1[10][10];
int ans[10][10][2];
string s;
void solve(int i,int j)
{
if(i==5&&j==1)
{
for(int i=1;i<=4;++i)
for(int j=1;j<=4;++j)
{
int noww=0;
if(all[i][j]!=-1)
{
for(int x=-1;x<=1;++x)
for(int y=-1;y<=1;++y)
noww=noww+all1[i+x][j+y];
if(noww!=all[i][j]) return ; //判断合法性
}
}
for(int i=1;i<=4;++i)
for(int j=1;j<=4;++j)
ans[i][j][all1[i][j]]=1;
return ;
}
all1[i][j]=0;
if(j<4) solve(i,j+1);
else solve(i+1,1);
if(all[i][j]==-1)
{all1[i][j]=1;
if(j<4) solve(i,j+1);
else solve(i+1,1);
}
}
int main()
{
for(int i=1;i<=4;++i)
{cin>>s;
for(int j=1;j<=4;++j)
if(s[j-1]!='.') all[i][j]=s[j-1]-'0';
else all[i][j]=-1;
}
solve(1,1);
for(int i=1;i<=4;++i)
for(int j=1;j<=4;++j)
{
if(all[i][j]!=-1)
cout<<all[i][j];
else
{
if(ans[i][j][0]==1&&ans[i][j][1]==0)
cout<<'O';
else if(ans[i][j][0]==0&&ans[i][j][1]==1)
cout<<'X';
else
cout<<".";
}
if(j==4) cout<<"\n";
}
}



京公网安备 11010502036488号