A----Dogs and Cages HDU - 6243(签到1)。
题意:
有n个笼子,n条狗。
问狗回不到自己的笼子的期望。
思路:
- 算每个狗回不到笼子的贡献。
- A n − 1 n − 1 / A n n A_{n-1}^{n-1}/A_{n}^{n} An−1n−1/Ann(先算可以回到笼子里,那么其他狗就全排列)
- 之后回不到笼子里,就是2中的式子相反。即 p = 1 − A n − 1 n − 1 / A n n p=1-A_{n-1}^{n-1}/A_{n}^{n} p=1−An−1n−1/Ann.
- 算出了一只狗的贡献,那么再算所有狗的 a n s = p ∗ n ans=p*n ans=p∗n
- 化简一下就是n-1.
- 最后由于输出是浮点数。注意
转换一下类型
。
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最多赢几场。
限制:
- A输了one point,B要给 ydollars。
- A赢了one point,要给B xdollars
- B不想欠钱
思路:
- 假如x>y,那么B肯定能赢,无限保持差一局,直到B(有钱)可以领先两局。
- 反之,那么就算出要输多少把。可以保持最多赢局。(当然数据小,也可以直接循环去做)
- 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个,问最多有多少个点。
思路:
- 用rm【】记录第 i i i个邮票向右最远延申多少。
- 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;
}