POJ刷水TAT

PROG1.
poj1260
珍珠:
有个人去买珍珠,他只能连续买几种珍珠或者单独买一种。
每个珍珠要买的数量为 ai ,每个珠子的单价为 ci ,然而每买一包珠子的时候卖家都会在里面放十个石子,也算作珠子,计算单价时以最贵的为准,保证单价单调不降。
也就是如果:
我要买单价为1的珠子10个,单价为100的1个。
我如果打包买的话,ans = (10 + 1 + 石子 * 10) * 100。
然而如果分别为1包买的话:ans = (10 + 10) * 1 + (1 + 10) * 100。
现在要求输出最小的话费。
题解:
设f[i]表示强制用i买前面某一段的最小话费。
f[i] = min(f[j] + (sum[i] - sum[j] + 10) * cost[i])
价格单调的嘛……所以这个转移一定是对的。
然后就没有啦!
Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define Rep(i,n) for(int i = 1;i <= n;i ++)
#define Rep_0(i,n) for(int i = 0;i < n; i ++)
using namespace std;
const int N = 105;
int T,c[N],a[N],f[N];
int main ()
{
    scanf("%d",&T);
    while(T --)
    {
        int n;
        scanf("%d",&n);
        Rep(i,n)
            scanf("%d%d",&a[i],&c[i]),a[i] += a[i - 1];
        Rep(i,n)
        {
            f[i] = 1 << 29;
            Rep_0(j,i)
                f[i] = min(f[j] + c[i] * (10 - a[j] + a[i]),f[i]);
        }
        printf("%d\n",f[n]);
    }
    return 0;
}

Prog2:
奶(暴)牛(力)词(D)典(P)
题意:给一个字符串s,里面包含着一些单词,奶牛有个词典,要求删掉最少的字符后使得所有单词都在词典上。
题解:
太暴力了。
f[i]表示到第i个删掉的最少的字符。
g[j,k]表示j - >k包含某个单词的最少去掉的字符。
f[i] = min{f[j - 1] + g[j][i]}{0 < j <= i}
代码不写了……真的是太暴力了……
Prog3:
poj2151:
这题的确是好题。
有T个队伍,M个题目,存在一些神犇,它们至少能AC N道题目。
每道题目每个队有一定的AC概率。
求每个队伍不爆0且赛场上存在神犇的概率。
题解:
这题因为读入问题我调了半个小时。
容斥原理+SBdp
f[i][j][k]表示前i道题目,队伍j强行AC了k道题的概率。

f[i][j][k]=f[i1][j][k1]p[i][j]+f[i1][j][k](1p[i][j])

然后我们考虑原事件是个并集状态,考虑到容斥原理,有:
ans = 所有不爆0的情况 - 所有人虽然不暴0然而也没有神犇出现的情况
All=j=1j<=Tk=1k<=Mf[M][j][k]

P(NoShenBen)=j=1j<=Tk=1k<Nf[M][j][k]

ans=AllP(NoShenBen);

实际代码可能有所不同。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define Rep(i,n) for(int i = 1;i <= n;i ++)
#define Rep_0(i,n) for(int i = 0;i < n; i ++)
using namespace std;
//f[i][j][k] = >第i道题,j的队伍强制AC k个 
//f[i][j][k] = f[i - 1][j][k - 1] * p[i][j] + f[i - 1][j][k] * (1 - p[i][j]);
//f[0][j][0] = 1 
double p[1005][35],f[1005][35][35],s[1005][35];
int main ()
{
 int prom,team,K;
 while(scanf("%d%d%d",&prom,&team,&K),prom | team | K)
 {
 memset(f,0,sizeof(f));
 Rep(i,team)
 Rep(j,prom)scanf("%lf",&p[i][j]); // n个题目m个队伍KAC 
 Rep(j,team)f[j][0][0] = 1;
 Rep(i,team)
 Rep(j,prom)
 {
 // int tmx = i & 1,tmp = i & 1 ^ 1;
 for(int k = 0;k <= j;k ++)
 if(k >= 1)f[i][j][k] = f[i][j - 1][k - 1] * p[i][j] + f[i][j - 1][k] * (1.0 - p[i][j]);
 else f[i][j][k] = f[i][j - 1][k] * (1.0 - p[i][j]);
 }
 double TOT = 1;
 Rep(j,team)TOT *= (1 - f[j][prom][0]);
 double EX = 1;
 Rep(j,team){
 double tmp = 0;
 Rep(k,K - 1)tmp += f[j][prom][k];
 EX *= tmp;
 }
 printf("%.3f\n",TOT - EX);
 }
 return 0;
}

自己还是太水了TAT

你可能感兴趣的:(POJ刷水TAT)