1009
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4651
题目大意:求一个数有多少种不同的划分方式
参考网址:
讲的很详细,重点就是一个公式
#include<iostream>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
#define mod 1000000007
long long int f[100001];
long long int f1[100001];
long long p[100001];
void ff() //求五角数
{
int i;
for(i=0;i<=5000;i++)
{
f[i]=i*(3*i-1)/2;
f1[i]=f[i]+i;
}
}
void pp()
{
memset(p,0,sizeof(p));
p[0]=1;
p[1]=1;
p[2]=2;
p[3]=3;
p[4]=5;
int i,j;
for(i=5;i<=100001;i++)
{
int ans=1; //后面两个样例一直错,原来是ans初始化放错位置了,低级错误要少犯
for(j=1;;j++)
{
if((i-f[j])<0&&(i-f1[j])<0)
break;
if((i-f[j])>=0)
p[i]=(p[i]+(ans*p[i-f[j]])+mod)%mod;
if((i-f1[j])>=0)
p[i]=(p[i]+(ans*p[i-f1[j]])+mod)%mod;
ans*=(-1);
}
}
}
int main()
{
ff();
int T;
int i,j;
int n;
pp();
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
cout<<(p[n]+mod)%mod<<endl;
}
return 0;
}
1006:Magic Pen 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4648
题目大意:求n个数中最多有多少个连续的数之和是m的倍数。 直接求就行
#include<iostream>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int a[110000];
long long int s[110000];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF) //又忘了加上EOF,导致TLE了
{
int i,j;
memset(s,0,sizeof(s));
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s[i]=s[i-1]+a[i];
}
int l;
int f=0;
for(l=n;l>=0;l--)
{
for(i=0;i+l<=n;i++)
{
if((s[i+l]-s[i])%m==0)
{
printf("%d\n",l);
f=1;
break;
}
}
if(f==1)
break;
}
}
return 0;
}
1011:k-th point
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4653
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<cstdio>
#include<cstring>
#define maxn 2005
#define INF 0xfffffff
using namespace std;
int main()
{
int t,p,n,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&p,&n,&k);
double ans=1;
for(int i=n-k;i<=n;i++)
{
ans*=1.0*i*p/(i*p+1);
}
printf("%.9lf\n",ans);
}
return 0;
}
1005 Another Graph Game
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4647
Baoge 一语惊醒所有人,只要把边平均给两个端点就行,这样两个人的差值总不会变的。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
long long int n,m;
double a[100011];
bool cmp(double x,double y)
{
return x>y;
}
int main()
{
while(scanf("%lld%lld",&n,&m)!=EOF)
{
int i,j;
for(i=1;i<=n;i++)
{
scanf("%lf",&a[i]);
}
long long int u,v;
double w;
for(i=1;i<=m;i++)
{
scanf("%lld%lld%lf",&u,&v,&w);
a[u]+=(w/2);
a[v]+=(w/2);
}
sort(a+1,a+1+n,cmp);
double sum1=0.0,sum2=0.0;
for(i=1;i<=n;i+=2)
{
sum1+=a[i];
}
for(i=2;i<=n;i+=2)
{
sum2+=a[i];
}
printf("%.0lf\n",sum1-sum2);
}
return 0;
}
07
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4649
用二进制把每一位所得概率*数字之和相加求出。
看了标程之后写的。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int b[202][202];
double f[202][202];
int a[202];
char c[202];
double p[202];
double sum;
int n;
void getBin()
{
int i1,j;
memset(b,0,sizeof(b));
for(i1=0;i1<=n;i1++)
{
j=0;
int x=a[i1];
while(x!=0)
{
b[i1][j]=x%2;
x/=2;
j++;
}
}
}
double pp(int x)
{
int i,j;
memset(f,0,sizeof(f));
if(b[0][x]==1)
{
f[0][1]=1;
}
else
{
f[0][0]=1;
}
for(i=1;i<=n;i++)
{
f[i][0]=f[i-1][0]*p[i];
f[i][1]=f[i-1][1]*p[i];
if(c[i]=='&')
{
if(b[i][x])
{
f[i][0]+=f[i-1][0]*(1-p[i]);
f[i][1]+=f[i-1][1]*(1-p[i]);
}
else
{
f[i][0]+=f[i-1][0]*(1-p[i]);
f[i][0]+=f[i-1][1]*(1-p[i]);
}
}
else if(c[i]=='|')
{
if(b[i][x])
{
f[i][1]+=f[i-1][0]*(1-p[i]);
f[i][1]+=f[i-1][1]*(1-p[i]);
}
else
{
f[i][1]+=f[i-1][1]*(1-p[i]);
f[i][0]+=f[i-1][0]*(1-p[i]);
}
}
else if(c[i]=='^')
{
if(b[i][x])
{
f[i][1]+=f[i-1][0]*(1-p[i]);
f[i][0]+=f[i-1][1]*(1-p[i]);
}
else
{
f[i][0]=f[i-1][0]*(1-p[i]);
f[i][1]=f[i-1][1]*(1-p[i]);
}
}
}
return f[n][1];
}
int main()
{
int i,j;
int cas=0;
while(scanf("%d",&n)!=EOF)
{
cas++;
for(i=0;i<=n;i++)
{
scanf("%d",&a[i]);
}
getBin();
for(i=1;i<=n;i++)
{
cin>>c[i];
}
for(i=1;i<=n;i++)
{
cin>>p[i];
}
sum=0;
for(i=0;i<20;i++)
{
sum+=(1<<i)*pp(i);
cout<<i<<":"<<pp[i]<<endl;
}
cout<<"Case "<<cas<<":"<<endl;
printf("%.6lf\n",sum);
}
return 0;
}