A.小红小紫投硬币
前n次概率都一样,小红比小紫多投了一次 ,所以概率为0.5
#include<iostream>
using namespace std;
//小红比小紫多投了一次 ,所以概率为0.5
int main()
{
cout<<"0.5";
}
B.小红的字符串
左边界和右边界的比较。
比如a和b:
k1=abs((int)a-(int)b)=1;
k2=26-b+a=26-k1;
求k1和k2的最小值。
边界往中间移动。
#include<iostream>
using namespace std;
int main()
{
int ans=0;
string s;
cin>>s;
int n=s.size();
int i=0,j=n-1;
while(i<j)
{
int k=abs(int(s[i])-(int)s[j]);
ans+=min(k,26-k);
i++;
j--;
}
cout<<ans;
}
C.小红的 01 消除
从左往右统计01有多少对,然后和y(最多可以执行删除01操作的次数)比较
#include<iostream>
using namespace std;
int main()
{
int ans=0,ans0=0,ans1=0;
int n;
cin>>n;
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0')
ans0++;
else
{
if(ans0)
{
ans++;
ans0--;
}
}
}
int x,y,z;
cin>>x>>y>>z;
cout<<min(ans,y);
}
D.小红组比赛
动态规划(DP)详细题解看这位大佬:
#include<iostream>
#include<cstring>
using namespace std;
int a[110][110];
bool b[110][6000];
int main()
{
memset(b,false,sizeof(b));
b[0][0]=true;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
int target;
cin>>target;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=a[i][j];k<=6000;k++)
{
b[i][k]|=b[i-1][k-a[i][j]];
}
}
}
int ans=1e9;
for(int k=0;k<=6000;k++)
{
if(b[n][k])
ans=min(ans,abs(k-target));
}
cout<<ans;
}
E.折半丢弃
没看懂