题目链接:http://codeforces.com/contest/443
水题,不解释
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[1200];
int vis[1000];
int main()
{
int i;
memset(vis,0,sizeof(vis));
gets(str);
for(i=0;i<strlen(str);i++)
{
//cout<<str[i]<<endl;
if(str[i]>='a' && str[i]<='z')
{
vis[str[i]]=1;
}
}
int ans=0;
for(i=0;i<1000;i++)
if(vis[i])ans++;
cout<<ans<<endl;
return 0;
}
一个长s的字符串,可以往右侧加上k个任意字符,问新串的最长“重复子串”有多长?
原字符串里都是小写字母,先把k个“0”加到字符串上,“0”代表可以是任意字母
然后根据题目中对于重复子串的定义:
A tandem repeat of length 2n is string s, where for any position i (1 ≤ i ≤ n) the following condition fulfills: si = si + n.
利用 si = si + n. 来直接暴力寻找最长重复子串就行了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char str[500];
int main()
{
freopen("input.txt","r",stdin);
int i,j,k;
scanf("%s",str);
int slen=strlen(str);
cin>>k;
int len=slen+k;
for(i=slen;i<len;i++)
str[i]='0';
int from,to,ans=-1;
for(from=0;from<slen;from++)
{
for(to=from+1;to<len;to+=2)
{
int n=(to-from+1)/2;
int flag=1;
for(i=from ;i <= (to-from)/2+from ;i++)
{
if(str[i]==str[i+n]||str[i+n]=='0')continue;
else
{
flag=0;break;
}
}
if(flag) ans=max(ans,2*n);
}
}
if(k>=slen) ans=k+slen-(k+slen)%2;
else
ans=max(ans,2*k);
cout<<ans<<endl;
return 0;
}
向n个人中的若干人寻求帮助,每个人有 Pi 的可能性提供帮助,我们想要有且只有一个人提供帮助,获得帮助的最大可能性是多少?(在选择最优的询问人员情况下)
事实上,是有数学规律的,先把这些人的可能性从大到小排序,然后如下:
①-- 第一个人的可能性就是只问一个人的最大可能性。
②-- 问前两个人的成功可能性就是只问两个人的最大可能性。
③-- 问前n个人的成功可能性就是只问n个人的最大可能性。
从以上数值中选取最大的就是答案。不知道为什么,但你试一下真是对的,我差那么一点点就想到了,真是郁闷!
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
double arr[200];
bool cmp(double a,double b) { return a>b;}
int main()
{
int n,i,j,k;
cin>>n;
for(i=0;i<n;i++)
{
cin>>arr[i];
}
sort(arr,arr+n,cmp);
double ans=-1;
for(i=0;i<n;i++)
{
double tans=0;
for(j=0;j<=i;j++)
{
double t=1;
for(k=0;k<=i;k++)
{
if(k==j) t*=arr[k];
else t*=(1-arr[k]);
}
tans+=t;
}
ans=max(ans,tans);
}
printf("%.12f\n",ans);
return 0;
}