A-Dogs and Cages
题目大意:
有n只狗和n个笼子,编号均从0到n-1。每次小狗会随机选择一个笼子进去,每个笼子只能容纳一只狗。求进入的笼子与自己的编号不同的小狗数量的期望值。
思路:逆向思维
1、某只小狗进入与自己编号相同的笼子的方案数为:
(
n
−
1
)
!
(n-1)!
(n−1)!(剩下的n-1只小狗全排列)
2、n只小狗全排列的方案数:
n
!
n!
n!
3、所以某只小狗进入与自己编号不同的笼子的方案数位:
n
!
−
(
n
−
1
)
!
n!-(n-1)!
n!−(n−1)!
4、n只小狗进入与自己编号不同的笼子的方案数即为:
n
(
n
!
−
(
n
−
1
)
!
)
n(n!-(n-1)!)
n(n!−(n−1)!)
5、样本总空间:
n
!
n!
n!
=>
a
n
s
=
n
(
n
!
−
(
n
−
1
)
!
)
/
n
!
=
n
−
1
ans=n(n!-(n-1)!)/n!= n-1
ans=n(n!−(n−1)!)/n!=n−1
没想到吧!最终答案就是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,只需知道买下这套邮票能够得到多少张邮票
(未完)