【心得体会】11.30-12.6

Tips

1、对于有精度要求的题目,注意判断ESP=1e-5,以免出错

总结

1、基础的贪心DP和搜索题要巩固,争取细节不出错,快速出题。

2、加强博弈论的学习。

本周题单

USACO

USACO Training 2.1.4 Healthy Holsteins

简单搜索

训练赛补题

Ray Tracing(CF)

题解链接:(补)

2020年广东工业大学第十届文远知行杯新生程序设计竞赛(补题)

A、肥猪的钢琴床

题目链接:https://ac.nowcoder.com/acm/contest/9692/A

dp,

a[i]==0
f[i][0]=min(f[i-1][0],f[i-1][1]);
f[i][1]=min(f[i-1][1],f[i-1][2])+1;
f[i][2]=f[i-1][2];
a[i]==1
f[i][0]=min(f[i-1][0],f[i-1][1])+1;
f[i][1]=min(f[i-1][1],f[i-1][2]);
f[i][2]=f[i-1][2]+1;

F、合并石子

题目链接:https://ac.nowcoder.com/acm/contest/9692/F

一共有 n堆石子,故合并时产生 (n-1)!种情况;
第 i次合并时共有n+1−i堆石子,故选取两堆的期望和为 2n/(n+1−i)
故消耗体力总和为 (n-1)!*(2n/2+2n/3+...+2n/n)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define M 1000000007

ll ksm(ll a,ll p){
    ll res=1;
    while(p){if(p&1){res=res*a%M;}a=a*a%M;p>>=1;}return res;
}

int i;
ll n,res,tmp;

int main(){
    scanf("%d",&n);
    for(i=2;i<=n;i++){
        res+=ksm(i,M-2)*n%M;
    }
    for(i=1;i<=n-1;i++){
        res=res*i%M;
    }
    printf("%lld",res*2%M);
}

C、母牛的俄罗斯轮盘赌

题目链接:https://ac.nowcoder.com/acm/contest/9692/C

思路:类似巴士博弈的思路,我们可以想到(想不到)第k枪和第k+5枪的结果是一样的,故只要计算出前五枪的结果就好。

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
inline int read(){
	int f=0,num;
	char ch;
	while(ch=getchar(),!isdigit(ch))if(ch=='-')f=1;num=ch-'0';
	while(ch=getchar(), isdigit(ch))num=num*10+ch-'0';
	return f?-num:num;
}
int t;
ll n; 
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		if(n==1||n==3||n==4)cout<<"Pig"<<endl; 
		else if(n==2)cout<<"Cow"<<endl;
		else if((n-1)%5==0||(n-3)%5==0||(n-4)%5==0) cout<<"Pig"<<endl; 
		else if((n-2)%5)cout<<"Cow"<<endl;
		else if(n%5==0) cout<<"Pig"<<endl; 
		else cout<<"Cow"<<endl;	
	}
	return 0;
}

posted @ 2020-12-08 18:01  Shayndel  阅读(94)  评论(0编辑  收藏  举报