扑克游戏
Description
有一棵無窮大的滿二叉樹,根為star,其余所有點的權值為點到根的距離,如圖:
現在你有一些撲克牌,點數從1到13,你要把這些撲克牌全部放到這個樹上:
1. 當你把點數為i的撲克牌放在權值為j的點上,那么你會得到i*j的分數。
2. 當你把一個撲克牌放在一個節點上,那么你就不能把別的撲克牌放在這個節點以及這個節點的子樹上。
你的目標是最小化你的得分。
Input
文件名為 poker.in
輸入第一行為一個數字N,表示你有的撲克牌數;
接下來一行N個數字,數字在1到13之間。
Output
文件名為 poker.out
一個數字,最小得分。
Sample Input
3
5 10 13
Sample Output
43
Data Constraint
Hint
【樣例說明】
【數據范圍】
30%數據 N<=100
100%數據滿足1<=N<=10000.
.
.
.
.
.
.
分析
這題聽別人講與哈夫曼樹有關
但簡化一下
就會發現
這題其實就是類似于
合并果子
.
.
.
.
.
程序:
#include<iostream> using namespace std; int n; long long a[10001]; void kp(int l,int r) {int i,j;long long min,g;if (l>=r) return;i=l;j=r;min=a[(l+r)/2];do{while (a[i]<min) i++;while (a[j]>min) j--;if (i<=j){g=a[i];a[i]=a[j];a[j]=g;i++;j--;}}while (i<=j);kp(l,j);kp(i,r); } int main() {int ans,bb,k;cin>>n; a[n+1]=2147483647;for (int i=1;i<=n;i++)cin>>a[i];kp(1,n);ans=0;for (int i=2;i<=n-1;i++){a[i]=a[i]+a[i-1];ans=ans+a[i];for (int j=i+1;j<=n+1;j++)if (a[i]<a[j]&&a[i]>=a[j-1]) {bb=j-1;break;}k=a[i];for (int j=i;j<=bb-1;j++)a[j]=a[j+1];a[bb]=k;}cout<<ans+a[n-1]+a[n];return 0; }轉載于:https://www.cnblogs.com/YYC-0304/p/9499939.html
總結
- 上一篇: 单足跳
- 下一篇: 【CQOI2009】叶子的颜色