scau暑假自主训练6 ------2017ccpc final G--dp

A----Dogs and Cages HDU - 6243(签到1)。

题意:

有n个笼子,n条狗。
问狗回不到自己的笼子的期望。

思路:

  1. 算每个狗回不到笼子的贡献。
  2. A n − 1 n − 1 / A n n A_{n-1}^{n-1}/A_{n}^{n} An1n1/Ann(先算可以回到笼子里,那么其他狗就全排列)
  3. 之后回不到笼子里,就是2中的式子相反。即 p = 1 − A n − 1 n − 1 / A n n p=1-A_{n-1}^{n-1}/A_{n}^{n} p=1An1n1/Ann.
  4. 算出了一只狗的贡献,那么再算所有狗的 a n s = p ∗ n ans=p*n ans=pn
  5. 化简一下就是n-1.
  6. 最后由于输出是浮点数。注意转换一下类型

AC

#include <iostream>
#include <cstdio>
using namespace std;
//
int main()
{
    //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t,cas=0;scanf("%d", &t);//cin>>t;
    while(t--){
        int n;scanf("%d", &n);
        printf("Case #%d: ",++cas);
        printf("%.6f\n",(double)(n-1));
    }
    return 0;
}

C----Rich Game HDU - 6245(签到2,博弈)

题意:

有两个人A和B打羽毛球。
问B最多赢几场。
限制:

  1. A输了one point,B要给 ydollars。
  2. A赢了one point,要给B xdollars
  3. B不想欠钱

思路:

  1. 假如x>y,那么B肯定能赢,无限保持差一局,直到B(有钱)可以领先两局。
  2. 反之,那么就算出要输多少把。可以保持最多赢局。(当然数据小,也可以直接循环去做)
  3. 2的具体计算过程,草稿纸太丑,发其他人的

AC

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int t,cas=0;scanf("%d", &t);
    while(t--){
        int x,y,k;
        scanf("%d%d%d", &x,&y,&k);
        if(x>y){
            printf("Case #%d: %d\n",++cas, k);
            continue;
        }
	 printf("Case #%d: %d\n",++cas, 11*x*k/(11*y+2*x));
    }
    return 0;
}

E----Evil Forest HDU - 6247 (签到3)

题意:

有n个competitions。每个competition有板子需求。
且每个competition要预留出大于参赛人数%10的板子。

思路:

就是向上取整。水题。

AC

#include <iostream>
#include <cstdio>
using namespace std;
//
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t,cas=0;cin>>t;
    while(t--){
        int n;cin>>n;
        int ans=0;
        for(int i=1; i<=n; i++){
            int x;cin>>x;
            ans+=x+(x+10-1)/10;
        }
        cout<<"Case #"<<++cas<<": ";
        cout<<ans<<endl;
    }
    return 0;
}

G----Alice’s Stamps HDU - 6249 (DP)

题意:

有m个区间。只取k个,问最多有多少个点。

思路:

  1. 用rm【】记录第 i i i个邮票向右最远延申多少。
  2. dp【i】【j】。
    i i i表示选第 i i i个邮票
    j j j 表示第 j j j个方案. j < = k j<=k j<=k

AC

#include <iostream>
#include <cstdio>
#include <cstring>
#define mst(x,a) memset(x,a,sizeof(x))
using namespace std;
int dp[2010][2010],rm[2010];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t,kase=0;cin>>t;
    while(t--){
        int n,m,k;cin>>n>>m>>k;
        mst(dp,0);mst(rm,0);
        for(int i=1; i<=m; i++){
            int l,r;cin>>l>>r;
            for(int j=l; j<=r; j++)rm[j]=max(rm[j],r);
        }
        for(int i=1; i<=n; i++){
            for(int j=1; j<=k; j++){
                dp[i][j]=max(dp[i][j],dp[i-1][j]);
                if(rm[i])dp[rm[i]][j]=max(dp[rm[i]][j],dp[i-1][j-1]+rm[i]-i+1);
            }
        }
        cout<<"Case #"<<++kase<<": ";
        cout<<dp[n][k]<<endl;
    }
    return 0;
}

J----Subway Chasing HDU - 6252

题解地址


K----Knightmare HDU - 6253(打表找规律)

题意:

马的走法,问最多有多少个格子可能被走过(走n步)。

思路:

打表,然后推公式。(可以bfs打表,g【】【】,记录点是否走过)

AC

#include <iostream>
using namespace std;
typedef unsigned long long ull;
ull ans[7]={1,9,41,109,205,325,473};
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t,kase=0;cin>>t;
    while(t--){
        ull n;cin>>n;
        cout<<"Case #"<<++kase<<": ";
        if(n<=6)cout<<ans[n]<<endl;
        else cout<<(n-6)*(14*n+78)+473<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值