1. 程式人生 > 實用技巧 >【心得體會】11.30-12.6

【心得體會】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;
}