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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值