#include<bits/stdc++.h>#define int long longusingnamespace std;constint INF =(1LL<<62);
vector<pair<pair<int,int>,int>> vec;
vector<vector<int>> G;
vector<vector<int>> adj;
vector<int> dist;
vector<int> pre;
vector<int> max_edge;
vector<int> mark;intDist(pair<int,int> a, pair<int,int> b){return(a.first - b.first)*(a.first - b.first)+(a.second - b.second)*(a.second - b.second);}voiddfs(int u,double& s1,double& s2){for(int i =0; i <(int)adj[u].size(); i++){int v = adj[u][i];
s1 +=((double)sqrt(max_edge[v])*(double)vec[v].second);
s2 +=(double)vec[v].second;dfs(v, s1, s2);}}signedmain(){
ios::sync_with_stdio(false);
cin.tie(0);int n;int tt =1;while(cin >> n){if(n ==0){break;}
vec.clear();
dist.resize(n);
pre.resize(n);
max_edge.resize(n);
mark.resize(n,0);
G.resize(n);for(int i =0; i < n; i++){
G[i].resize(n);}
adj.resize(n);for(int i =0; i < n; i++){int x, y, m;
cin >> x >> y >> m;
vec.push_back(make_pair(make_pair(x, y), m));}for(int i =0; i < n; i++){for(int j =0; j < n; j++){
G[i][j]=Dist(vec[i].first, vec[j].first);}}int pos =0;
mark[pos]=1;for(int i =0; i < n; i++){
dist[i]= G[pos][i];
max_edge[i]= G[pos][i];
pre[i]= pos;}double s1 =0.0;double s2 = vec[pos].second;for(int i =1; i < n; i++){int Min_dist = INF;int Max_Peo =0;for(int j =0; j < n; j++){if(mark[j]==0&& Min_dist > dist[j]){
Min_dist = dist[j];
Max_Peo = vec[j].second;
pos = j;}elseif(mark[j]==0&& Min_dist == dist[j]&&
Max_Peo < vec[j].second){
Max_Peo = vec[j].second;
pos = j;}}
max_edge[pos]=max(max_edge[pre[pos]], dist[pos]);
mark[pos]=1;
adj[pre[pos]].push_back(pos);for(int j =0; j < n; j++){if(mark[j]==0&& G[pos][j]< dist[j]){
dist[j]= G[pos][j];
pre[j]= pos;}elseif(mark[j]==0&& G[pos][j]== dist[j]&&
max_edge[pos]< max_edge[pre[j]]){
pre[j]= pos;}}}dfs(0, s1, s2);printf("Island Group: %d Average %.2f\n\n", tt, s1 / s2);
tt++;
dist.clear();
pre.clear();
max_edge.clear();
mark.clear();
G.clear();
adj.clear();}return0;}
java:
import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Scanner;publicclassMain{publicstaticvoidmain(String args[]){
Scanner in =newScanner(System.in);int tt =1;while(true){//in.nextInt();//接收结束字符 0;int num = in.nextInt();if(num==0){break;}int arr1[][]=newint[num][3];for(int i =0; i < num ; i++){for(int j =0; j <3;j++){
arr1[i][j]=in.nextInt();}}double arr2[][]=newdouble[num][num];for(int i =0; i < num ; i++){for(int j =0; j < num ;j++){
arr2[i][j]=(Math.sqrt((arr1[i][0]-arr1[j][0])*(arr1[i][0]-arr1[j][0])+(arr1[i][1]-arr1[j][1])*(arr1[i][1]-arr1[j][1])));}}int arris[]=newint[num];//是否被使用int tempi = num;double templ = Math.pow(2,31);int parent=0;int me =0;double arr3[][]=newdouble[num][3];//本身 到父节点的长度 父节点
arris[0]=-1;while(tempi!=1){
templ = Math.pow(2,31);for(int i =0;i<num;i++){if(arris[i]==0){continue;}for(int j =0; j < num ;j++){if(arris[j]!=0){continue;}if(templ>arr2[i][j]){
templ=arr2[i][j];
me = j;
parent =i;}}}
arr3[me][0]=me;
arr3[me][1]=templ;
arr3[me][2]=parent;
arris[me]=-1;
tempi--;//System.out.println("look me ! "+me+" "+templ+" "+parent);}double sum =0;int people=0;for(int i =0; i < num ; i++){
sum +=(fun1(arr3,i)*arr1[i][2]);
people +=arr1[i][2];//System.out.println(sum+" "+people+" "+fun1(arr3,i));}double answer = Math.round(sum/people *100)*0.01d;
System.out.printf("Island Group: %d Average %.2f\n\n", tt++, answer);}}publicstaticdoublefun1(double arr3[][],int i){double max = arr3[i][1];int parent =(int)arr3[i][2];while(parent!=0){if(max<arr3[parent][1]){
max=arr3[parent][1];}
parent =(int)arr3[parent][2];}return max;}}
ADV-283 矩形靶
cpp:
#include<stdio.h>#include<string.h>intmin(int a,int b){return a < b ? a : b;}intmax(int a,int b){return a > b ? a : b;}intmain(){int N, M, L, R;char target[605][605]={0}, state[605][605]={0};scanf("%d %d %d %d",&N,&M,&L,&R);for(int i =0; i < N;++i){scanf("%s", target[i]);strcpy(state[i], target[i]);}for(int i =0; i < N;++i){for(int j =0; j < M;++j){if(target[i][j]=='1'){for(int s =max(0, i - L); s <=min(N -1, i + L);++s)for(int r =max(0, j - R); r <=min(M -1, j + R);++r)
state[s][r]='1';}}}for(int i =0; i < N;++i)printf("%s\n", state[i]);return0;}
java:
import java.util.Scanner;publicclassMain{publicstaticvoidmain(String[] args){
Scanner sc =newScanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int l = sc.nextInt();int r = sc.nextInt();char[][] str =newchar[n][m];char[][] a =newchar[n][m];for(int i =0; i < n; i++){
String s = sc.nextLine();if(s.equals("")){
s = sc.nextLine();}
str[i]= s.toCharArray();
a[i]= s.toCharArray();}for(int i =0; i < n; i++){for(int j =0; j < m; j++){if(str[i][j]=='1'){for(int i1 = i - l <0?0: i - l; i1 <= i + l && i1 < n;
i1++){for(int j1 = j - r <0?0: j - r;
j1 <= j + r && j1 < m; j1++){
a[i1][j1]='1';}}}}}for(int i =0; i < n; i++){for(int j =0; j < m; j++){
System.out.print(a[i][j]);}
System.out.println();}}}
ADV-284 GPA
cpp:
#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;constint maxn =2e5+5;constint maxc =26;const ll mod =1e9+7;constint inf =0x3f3f3f3f;constdouble eps =5e-3;inlineintread(){int f =1, x =0;char ch =getchar();while(ch <'0'|| ch >'9'){if(ch =='-') f =-1;
ch =getchar();}while(ch >='0'&& ch <='9'){
x = x *10+ ch -48;
ch =getchar();}return f * x;}
ll gcd(ll a, ll b){return!b ? a :gcd(b, a % b);}
ll poww(ll x, ll y){
ll ans =1;while(y){if(y &1) ans = ans * x;
x = x * x;
y >>=1;}return ans;}int n, s;char c[10];intmain(){
cin >> n;int fz =0, fm =0;while(n--){
cin >> s;scanf("%s", c);if(c[0]=='N'|| c[0]=='P')continue;else{
fz += s *atoi(c);
fm += s;}}double g1 = fz *1.0/ fm;
cin >> n;
fz = fm =0;while(n--){
cin >> s;scanf("%s", c);if(c[0]=='N'|| c[0]=='P')continue;else{
fz += s *atoi(c);
fm += s;}}double g2 = fz *1.0/ fm;// printf("%lf\n",abs(g1-g2));if(abs(g1 - g2)< eps)
cout <<"0.00"<< endl;elseprintf("%.2lf\n", g1 - g2);return0;}
java:
import java.util.Scanner;publicclassMain{publicstaticvoidmain(String[] args){
Scanner sc =newScanner(System.in);int n = sc.nextInt();int Si =0;int SC =0;for(int i=0;i<n;i++){int si = sc.nextInt();int ci =0;
String s = sc.next();if(s.equals("N")|| s.equals("P"))continue;
ci = Integer.parseInt(s);
Si += si;
SC += si*ci;}double GPA1 =1.0*SC/Si;
n = sc.nextInt();
Si =0;
SC =0;for(int i=0;i<n;i++){int si = sc.nextInt();int ci =0;
String s = sc.next();if(s.equals("N")| s.equals("P"))continue;
ci = Integer.parseInt(s);
Si += si;
SC += si*ci;}double GPA2 =1.0*SC/Si;double ans = GPA1-GPA2;
String s = String.format("%.2f",ans);if(s.equals("-0.00")) s="0.00";
System.out.println(s);}}
ADV-285 套正方形
cpp:
#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;constint maxn =2e5+5;constint maxc =26;const ll mod =1e9+7;constint inf =0x3f3f3f3f;constdouble eps =5e-3;inlineintread(){int f =1, x =0;char ch =getchar();while(ch <'0'|| ch >'9'){if(ch =='-') f =-1;
ch =getchar();}while(ch >='0'&& ch <='9'){
x = x *10+ ch -48;
ch =getchar();}return f * x;}
ll gcd(ll a, ll b){return!b ? a :gcd(b, a % b);}
ll poww(ll x, ll y){
ll ans =1;while(y){if(y &1) ans = ans * x;
x = x * x;
y >>=1;}return ans;}int n;char s[55][55];intmain(){
cin >> n;int l =1, wid = n;//左上起点,宽度while(wid >=2){for(int i = l; i <= l + wid -1; i++){for(int j = l; j <= l + wid -1; j++){if(i == l || i == l + wid -1|| j == l || j == l + wid -1)
s[i][j]='*';}}
l +=2;
wid -=4;}for(int i =1; i <= n; i++) s[i][n +1]='\0';for(int i =1; i <= n; i++){for(int j =1; j <= n; j++){printf("%c", s[i][j]);if(j == n)printf("%c",'\n');}}return0;}
java:
import java.util.ArrayList;import java.util.ListIterator;import java.util.Scanner;publicclassMain{publicstaticvoidmain(String[] args){
Scanner sc =newScanner(System.in);int n = sc.nextInt();
sc.close();
ArrayList<String> list =newArrayList<>();
StringBuffer s =newStringBuffer("");for(int i =0; i < n; i++)
s = s.append("*");int l =1, r = n -2;
String current =" ";
list.add(s.toString());for(int i =1; i < n /2; i++){for(int j = l; j < r +1; j++){
s.replace(j, j +1, current);}
l++;
r--;if(current.equals(" ")){
current ="*";}else{
current =" ";}
list.add(s.toString());}
ListIterator listIterator = list.listIterator();while(listIterator.hasNext()){
System.out.println(listIterator.next());}while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());}}}
ADV-286 Channel
cpp:
#include<cmath>#include<iostream>usingnamespace std;voidhang(int N,int x,int y)//输出行{for(int i =1; i <= N; i++)for(int j =1; j <= N; j++)if(i == x) cout <<"("<< i <<","<< j <<")";
cout << endl;}voidlie(int N,int x,int y)//输出列{for(int i =1; i <= N; i++)for(int j =1; j <= N; j++)if(j == y) cout <<"("<< i <<","<< j <<")";
cout << endl;}voidzuoxiayoushang(int N,int x,int y)//对角线上的坐标有一个特点就是对角线上的任意两个点的x坐标与y坐标的差值是相等的{for(int i = N; i >=1; i--)//从左下到右上的对角线要从最后一行找起 注意咯{for(int j = N; j >=1; j--){for(int k =-N; k <= N; k++)// k值就是坐标之间的差值{if(i - x == k && j - y ==-k){
cout <<"("<< i <<","<< j <<")";}}}}
cout << endl;}voidzuoshangyouxia(int N,int x,int y)//对角线上的坐标有一个特点就是对角线上的任意两个点的x坐标与y坐标的差值是相等的{for(int i =1; i <= N; i++)//从左上到右下的这条对角线要从第一行找起{for(int j =1; j <= N; j++){for(int k =-N; k <= N; k++)// k值就是坐标之间的差值{if(i - x == k && j - y == k){
cout <<"("<< i <<","<< j <<")";}}}}
cout << endl;}intmain(){// freopen("data.in.txt","r",stdin);// freopen("data.out.txt","w",stdout);int N, x, y;while(cin >> N >> x >> y){hang(N, x, y);//输出同一行的坐标lie(N, x, y);//输出同一列的坐标zuoshangyouxia(N, x, y);//输出从左上到右下的对角线坐标zuoxiayoushang(N, x, y);//输出从左下到右上的对角线坐标}return0;}
ADV-287 Monday-Saturday质因子
cpp:
#include<iostream>usingnamespace std;boolms(int x){if(x %7==1|| x %7==6)return1;elsereturn0;}boolmsy(int a,int b){if(b % a)return0;else{int x = b / a;if(ms(x))return1;elsereturn0;}}boolmsz(int x){for(int i =2; i < x; i++)if(msy(i, x))return0;return1;}intmain(){int n;while(cin >> n){if(n ==1)break;
cout << n <<":";for(int i =6; i <= n; i++){if(ms(i)){if(msy(i, n)&&msz(i)) cout <<" "<< i;}}
cout << endl;}return0;}
#include<stdio.h>#include<iostream>usingnamespace std;doubledet(int n,double*aa){if(n ==1)return aa[0];double*bb =newdouble[(n -1)*(n -1)];//创建n-1阶的代数余子式阵bbint mov =0;//判断行是否移动double sum =0.0;// sum为行列式的值for(int arow =0; arow < n; arow++)// a的行数把矩阵a(nn)赋值到b(n-1){for(int brow =0; brow < n -1;
brow++)//把aa阵第一列各元素的代数余子式存到bb{
mov =
arow > brow
?0:1;// bb中小于arow的行,同行赋值,等于的错过,大于的加一for(int j =0; j < n -1; j++)//从aa的第二列赋值到第n列{
bb[brow *(n -1)+ j]= aa[(brow + mov)* n + j +1];}}int flag =(arow %2==0?1:-1);//因为列数为0,所以行数是偶数时候,代数余子式为1.
sum += flag * aa[arow * n]*det(n -1, bb);// aa第一列各元素与其代数余子式积的和即为行列式}delete[] bb;return sum;}intmain(){int n =0;//阶数scanf("%d",&n);/*读入阶数*/double*aa =newdouble[n * n];for(int i =0; i < n * n; i++) cin >> aa[i];printf("%.f\n",det(n, aa));delete[] aa;return0;}
java:
import java.io.*;publicclassMain{static BufferedReader in =newBufferedReader(newInputStreamReader(System.in));static BufferedWriter out =newBufferedWriter(newOutputStreamWriter(System.out));publicstaticintInt(String s){return Integer.parseInt(s);}publicstaticvoidcopy(int[][]A,int[][] A1,int i,int len)throws IOException{for(int x =1; x < len; x++)for(int y =0, j =0; j < len; j++)if(j != i){
A1[x-1][y++]= A[x][j];}}publicstaticintF(int[][] A,int len)throws Exception{int res =0;if(len ==1)return A[0][0];if(len ==2){return A[0][0]*A[1][1]- A[0][1]*A[1][0];// 递归出口}else{int A1[][]=newint[10][10];for(int i =0; i < len; i++){copy(A, A1, i, len);
res += Math.pow(-1, i)* A[0][i]*F(A1, len-1);//递归式}}return res;}publicstaticvoidmain(String[] args)throws Exception{int n;
n = Integer.parseInt(in.readLine());int arr[][]=newint[10][10];for(int i =0; i < n; i++){
String[] s = in.readLine().split(" ");for(int j =0; j < n; j++){
arr[i][j]=Int(s[j]);}}
out.write(F(arr, n)+"\n");
out.flush();}}
ADV-293 最大值路径
cpp:
#include<bits/stdc++.h>usingnamespace std;int n;int*p;int maxx =0;int countb =1;voiddps(int x,int y,int sum){if(x <0|| y <0|| x >= n || y >= n)return;
sum += p[x * n + y];if(x ==0&& y == n -1){if(sum > maxx){
maxx = sum;
countb =1;}elseif(sum == maxx)
countb++;}dps(x -1, y, sum);dps(x, y +1, sum);}intmain(){
cin >> n;
p =newint[n * n];for(int i =0; i < n; i++)for(int j =0; j < n; j++) cin >> p[i * n + j];dps(n -1,0,0);
cout << countb <<" "<< maxx;return0;}
java:
import java.util.Scanner;publicclassMain{privatestaticint n;privatestaticint[][] dp;privatestaticint result=1;privatestaticvoidtotal(int x,int y){if(x+1>n-1||y-1<0){return;}if(x==n-1&&y==0){return;}if(dp[x][y -1]> dp[x +1][y]){total(x, y -1);}elseif(dp[x][y -1]< dp[x +1][y]){total(x +1, y);}else{
result++;total(x, y -1);total(x +1, y);}}publicstaticvoidmain(String[] args){
Scanner scanner =newScanner(System.in);
n = scanner.nextInt();int[][] arr =newint[n][n];for(int i =0; i < n; i++){for(int j =0; j < n; j++){
arr[i][j]= scanner.nextInt();}}
dp =newint[n][n];
dp[n -1][0]= arr[n -1][0];for(int i = n -2; i >=0; i--){
dp[i][0]= arr[i][0]+ dp[i +1][0];}for(int i =1; i < n; i++){
dp[n -1][i]= arr[n -1][i]+ dp[n -1][i -1];}for(int i = n -2; i >=0; i--){for(int j =1; j < n; j++){
dp[i][j]= Math.max(dp[i][j -1], dp[i +1][j])+ arr[i][j];}}total(0,n-1);
System.out.println(result +" "+ dp[0][n -1]);}}
ADV-294 最长滑雪道
cpp:
#include<algorithm>#include<cmath>#include<cstdio>#include<cstring>#include<iostream>usingnamespace std;constint maxn =105;int a[maxn][maxn];int dp[maxn][maxn];struct node {int x, y, h;} A[maxn * maxn];boolcmp(node a, node b){return a.h < b.h;}intmain(){int n, c;while(scanf("%d%d",&n,&c)==2){memset(dp,0,sizeof(dp));memset(a,0,sizeof(a));int num =0;for(int i =1; i <= n; i++){for(int j =1; j <= c; j++){scanf("%d",&a[i][j]);
A[num].x = i;
A[num].y = j;
A[num++].h = a[i][j];
dp[i][j]=1;//初始条件}}sort(A, A + num, cmp);//排序//这样处理了之后就不用考虑边界的问题了,边界的点都比边界外的高,但是边界外面的dp初始值为0//加上1之后还是不变for(int k =0; k < num; k++){int i = A[k].x;int j = A[k].y;if(a[i][j]> a[i -1][j])
dp[i][j]=max(dp[i][j], dp[i -1][j]+1);if(a[i][j]> a[i][j -1])
dp[i][j]=max(dp[i][j], dp[i][j -1]+1);if(a[i][j]> a[i +1][j])
dp[i][j]=max(dp[i][j], dp[i +1][j]+1);if(a[i][j]> a[i][j +1])
dp[i][j]=max(dp[i][j], dp[i][j +1]+1);}int ans =0;for(int i =1; i <= n; i++){for(int j =1; j <= c; j++){// cout<<dp[i][j]<<" ";
ans =max(ans, dp[i][j]);}// cout<<endl;}printf("%d\n", ans);}return0;}
java:
import java.util.Scanner;publicclassMain{/**
* @param args
*/// TODO Auto-generated method stubstaticint p[][]={{1,0},{0,1},{-1,0},{0,-1}};staticint max = Integer.MIN_VALUE, r, c;publicstaticvoidmain(String[] args){
Scanner sc =newScanner(System.in);
r = sc.nextInt();
c = sc.nextInt();int[][] a =newint[r][c];for(int i =0; i < r; i++){for(int j =0; j < c; j++){
a[i][j]= sc.nextInt();}}for(int i =0; i < r; i++){for(int j =0; j < c; j++){dfs(a, i, j,1);}}
System.out.println(max);}publicstaticvoiddfs(int[][] a,int i,int j,int sum){int t, x, y;if(sum > max)//找出可以走的路径中的最大值
max = sum;for(t =0; t <4; t++)//向上下左右分别搜索{
x = i + p[t][0];//在节点处向上和下移动
y = j + p[t][1];//在节点处向左和右移动if(x >=0&& x < r && y >=0&& y < c && a[x][y]< a[i][j])//如果没有超出数组边界且这个节点比原来的小{
sum++;//我们的路的长度加一dfs(a, x, y, sum);//在新节点重复此次循环,到达路径最小处结束循环
sum--;//回溯到可以走的节点时把走过的路的长度减去}}}}
ADV-295 fx
cpp:
#include<cstdio>#include<cstring>#include<iostream>usingnamespace std;#define MOD 1000000007int f[210][66], A[210], B[210];char s1[210], s2[210];intread(){int s =0, fh =1;char ch =getchar();while(ch <'0'|| ch >'9'){if(ch =='-') fh =-1;
ch =getchar();}while(ch >='0'&& ch <='9'){
s = s *10+(ch -'0');
ch =getchar();}return s * fh;}intDfs(int len,int tot,int flag)//当前到达第len位,差值之和为tot,flag为是否限制(0代表不限制,1代表限制){if(len ==0)return tot >=0;if(tot <-30)return0;//这两句!!!if(tot >30) tot =30;//这两句!!!if(flag ==0&& f[len][tot +30]!=-1)return f[len][tot +30];int end = flag ? B[len]:9, i, ret =0;for(i =0; i <= end; i++)
ret =(ret +Dfs(len -1,(tot + A[len]- i)*2, flag &&(i == end)))%
MOD;if(flag ==0) f[len][tot +30]= ret;return ret;}intmain(){int case1 =0, T, la, lb, i;
T =read();while(T--){scanf("\n%s %s", s1 +1, s2 +1);
la =strlen(s1 +1);
lb =strlen(s2 +1);memset(A,0,sizeof(A));memset(B,0,sizeof(B));memset(f,-1,sizeof(f));for(i =1; i <= la; i++)
A[i]= s1[la - i +1]-'0';//要从高位枚举,所以要把序列倒过来.for(i =1; i <= lb; i++) B[i]= s2[lb - i +1]-'0';//同上.if(la > lb)swap(la, lb);//取出长度大的.printf("Case #%d: %d\n",++case1,Dfs(lb,0,1));}return0;}
ADV-296 奥运会开幕式
cpp:
#include<stdio.h>intmain(){int a[10010], m, n, x, count, i;scanf("%d %D",&m,&n);for(i =1; i <= m; i++){
a[i]= i, count = m, x =0;}for(i =0; count >1; i++){if(a[i % m +1]!=-1) x++;if(x == n && a[i % m +1]!=-1){
a[i % m +1]=-1, count--, x =0;}}for(i =1; i <= m; i++){if(a[i]!=-1)printf("%d\n", i);}return0;}
java:
import java.util.Scanner;publicclassMain{publicstaticvoidmain(String[] args){// TODO Auto-generated method stub
Scanner sc=newScanner(System.in);int n=sc.nextInt();int m=sc.nextInt();int p=0;for(int i =2; i <= n; i++){
p=(p+m)%i;}
System.out.println(p+1);}}
ADV-297 快速排序
cpp:
#include<iostream>usingnamespace std;voidquicksort(int arr[],int low,int high){int i = low, j = high;int temp;if(low < high){
temp = arr[low];while(i != j){while(j > i && arr[j]>= temp){
j--;}
arr[i]= arr[j];while(i < j && arr[i]<= temp){
i++;}
arr[j]= arr[i];}
arr[i]= temp;quicksort(arr, low, i -1);quicksort(arr, i +1, high);}}intmain(){int arr[10]={5,2,6,1,7,3,4};int i =0, n;for(i =0; i <10; i++){
cin >> arr[i];if(arr[i]==0){break;}}
n = i;quicksort(arr,0, n -1);for(i =0; i < n; i++){
cout << arr[i]<<" ";}return0;}
#include<stdio.h>#define INF 0x3F3F3F3Fintmax(int a,int b){return a > b ? a : b;}intmin(int a,int b){return a < b ? a : b;}intmain(){int n, m;int heights[105]={0};int max_height[105][105]={0};int f[105][105]={0};scanf("%d %d",&n,&m);for(int i =1; i <= n;++i)scanf("%d",&heights[i]);for(int i =1; i <= n;++i){
max_height[i][i]= heights[i];for(int j = i +1; j <= n;++j)
max_height[i][j]=max(max_height[i][j -1], heights[j]);}for(int i =1; i <= n;++i){
f[i][1]= i * max_height[1][i];for(int j =2; j <= i && j <= m;++j){
f[i][j]= INF;for(int k =1; k <= i - j +1;++k)
f[i][j]=min(f[i][j],
f[i - k][j -1]+ k * max_height[i - k +1][i]);}}printf("%d", f[n][m]);return0;}