1005 Another Graph Game
Code#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=100000+100;
int n,m,u,v;
double d[N],w,ans;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=1;i<=n;i++) scanf("%lf",&d[i]);
for(int i=1;i<=m;i++){
scanf("%d%d%lf",&u,&v,&w);
d[u]+=w/2;
d[v]+=w/2;
}
sort(d+1,d+n+1);ans=0;
for(int i=n;i>=1;i-=2) ans+=d[i]-d[i-1];
printf("%.0lf
",ans);
}
return 0;
}
1006 Magic Pen 6
就是求最长的一段子段和模M为0。扫描过程中就把前缀和取模得到结果第一次出现记下来,然后查一下更新答案。
1007 Professor Tian
这个题目比较惊喜,没怎么出数据,我思路也比较模糊的时候一交就一次AC了。首先考虑到实数不能位运算以及一个讨巧的想法(能直接DP的话就出题人出加减乘除都无所谓啊,出位运算肯定是考位运算的特性),于是把一个算式当成32(20)个算式算,即是说按位来算。直接算期望不好算,我就算当前位最后是1的概率,考虑期望的可加性,概率乘权值求和即为期望。求概率DP做,分运算运算符消失和不消失以及运算符运算规律讨论一下做做加法就好了。
另外,原来printf是四舍五入的啊。
另外,我的方程比标程简单。
Code#include <iostream>
#include <cstdio>
#define ull unsigned long long
using namespace std;
const int N=200+10;
char tmp,op[N];
int n,A[N];
double p[N],f[N],ans;
double calc(int k)
{
f[1]=((A[1]>>k)&1);
for(int i=2;i<=n;i++){
int ai=(A[i]>>k)&1;
if(op[i]=='|')f[i]=p[i]*f[i-1]+(1-p[i])*(ai+(!ai)*f[i-1]);
if(op[i]=='&')f[i]=p[i]*f[i-1]+(1-p[i])*ai*f[i-1];
if(op[i]=='^'){
if(ai) f[i]=p[i]*f[i-1]+(1-p[i])*(1-f[i-1]);
else f[i]=f[i-1];
}
}
return f[n];
}
int main()
{
int cnt=0;
while(scanf("%d",&n)!=EOF){n++;ans=0;
for(int i=1;i<=n;i++) cin>>A[i];
for(int i=2;i<=n;i++) cin>>op[i];
for(int i=2;i<=n;i++) cin>>p[i];
for(int i=0;i<20;i++) ans+=calc(i)*((ull)1<<i);
printf("Case %d:
",++cnt);
printf("%.6lf
",ans);
}
return 0;
}