2017中国大学生程序设计竞赛-总决赛-重现赛

A-Dogs and Cages

题目大意:
有n只狗和n个笼子,编号均从0到n-1。每次小狗会随机选择一个笼子进去,每个笼子只能容纳一只狗。求进入的笼子与自己的编号不同的小狗数量的期望值。

思路:逆向思维
1、某只小狗进入与自己编号相同的笼子的方案数为: ( n − 1 ) ! (n-1)! (n1)!(剩下的n-1只小狗全排列)
2、n只小狗全排列的方案数: n ! n! n!
3、所以某只小狗进入与自己编号不同的笼子的方案数位: n ! − ( n − 1 ) ! n!-(n-1)! n!(n1)!
4、n只小狗进入与自己编号不同的笼子的方案数即为: n ( n ! − ( n − 1 ) ! ) n(n!-(n-1)!) nn!(n1)!
5、样本总空间: n ! n! n!
=> a n s = n ( n ! − ( n − 1 ) ! ) / n ! = n − 1 ans=n(n!-(n-1)!)/n!= n-1 ans=nn!(n1)!/n!=n1
没想到吧!最终答案就是n-1,推了很久也没算明白。。。现在想想,自己似乎做着做着就有点曲解题意了😫

#include<bits/stdc++.h>
#define pb push_back
#define mpi make_pair
#define fi first
#define se second
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define pi acos(-1)
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
typedef pair<int,int> P;
inline ll lowbit(ll x){return x&(-x);}
int main(){
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++){
		int n;
		scanf("%d",&n);
		printf("Case #%d: %d.0000000000\n",i,n-1);
	} 
    return 0;
}

C-Rich Game

题目大意:
羊和熊猫打羽毛球。羊每赢一分就给熊猫x元,熊猫每赢一分就给羊y元。他们一共打k场比赛,熊猫由于技艺高超,可以控制每一个球的输赢。熊猫一开始身无分文,需要通过输比赛来赢钱。比赛全程,熊猫都不可以向羊借钱,求熊猫在k场比赛中最多能赢几场。

思路:
1、数据很小:贪心加模拟
赢钱以0:11比分赢
输钱则以11:9比分输
2、假设未知数,加以分析
在这里插入图片描述

#include<bits/stdc++.h>
#define pb push_back
#define mpi make_pair
#define fi first
#define se second
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define pi acos(-1)
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
typedef pair<int,int> P;
inline ll lowbit(ll x){return x&(-x);}
int main(){
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++){
		int x,y,k;
		scanf("%d%d%d",&x,&y,&k);
		int ans=0;
		if(x==y) ans=11*k/13;
		else if(x<y) ans=11*k*x/(2*x+11*y);
		else ans=k;
		printf("Case #%d: %d\n",i,ans);
	} 
    return 0;
}

E-Evil Forest

题目大意:
举办绘画比赛,每天准备的画板数都要比参赛人数多10%,求整场比赛共需准备多少画板。

图着省事,直接乘1.1,结果wa了。。。
精度问题,具体什么原因,我也搞不清楚了😅
改成a+0.1*a就能过

#include<bits/stdc++.h>
#define pb push_back
#define mpi make_pair
#define fi first
#define se second
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define pi acos(-1)
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
typedef pair<int,int> P;
inline ll lowbit(ll x){return x&(-x);}
int main(){
    int t,n;
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
        scanf("%d",&n);
        int ans=0;
        for(int j=0;j<n;j++){
            int x;
            scanf("%d",&x);
            ans+=x;
            ans+=ceil(x*0.1);
        }
        printf("Case #%d: %d\n",i,ans);
    } 
    return 0;
}

G-Alice’s Stamps

题目大意:
共有n种邮票,编号从1到n。现有m套邮票出售,第i套邮票包含了编号从 L i L_i Li R i R_i Ri的邮票。同一种邮票可能出现在很多套邮票中,每套邮票的价格一样。Alice现在只能买k套邮票,求她最多能买到几张邮票。

思路:
能买到的邮票数量取决于买哪几套邮票,所以对于每一套邮票存在选与不选两种可能。
“选与不选”—>01背包问题
但这个题跟01背包不同的是,所给的是每套邮票的区间,而且区间是有可能会重叠的
然后就学到了一个很棒的区间处理方法:
因为我们的目标只与邮票数量有关,所以对于每个区间我们其实不用考虑l和r,只需知道买下这套邮票能够得到多少张邮票
(未完)

K-Knightmare

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值