最小函数值
https://www.luogu.org/recordnew/show/17149258
題解:
C++版本一
#include <iostream>using namespace std;int main(){int n,m,i,j,cmin,jmin;int A[10010], B[10010], C[10010];int F[10010];cin>>n>>m;for(i=0;i<n;i++){cin>>A[i]>>B[i]>>C[i];F[i]=1;}for(i=0;i<m;i++){cmin=100000000;for(j=0;j<n;j++){if(A[j]*F[j]*F[j]+B[j]*F[j]+C[j]<cmin){cmin=A[j]*F[j]*F[j]+B[j]*F[j]+C[j];jmin=j;}}cout<<A[jmin]*F[jmin]*F[jmin]+B[jmin]*F[jmin]+C[jmin]<<' ';F[jmin]++;}return 0;}C++版本二
小根堆
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int using namespace std; typedef long long ll; //typedef __int128 lll; const int N=100000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,q; int ans,cnt,flag,temp,sum; char str; struct node{int a,b,c,f;//每個函數的"箭頭"位置; }e[N]; struct DUI{int val;//箭頭表示的函數值int x;//每個函數都有被輸入進來的先后順序,這個是第x個輸入進來的函數//因為堆里面的節點總是在變化的,所以我們要記錄哪個函數在哪個位置 }a[10010]; int heap_size;//堆的大小 void CHANGE(int m, int n){//自己寫的交換函數DUI t;t=a[m];a[m]=a[n];a[n]=t; } void MIN_HEAPIFY(int i){int l=i*2;//右子節點int r=i*2+1;//左子節點int smallest;//記錄父子節點值最小的那個if(l<=heap_size&&a[l].val<a[i].val)smallest=l;elsesmallest=i;if(r<=heap_size&&a[r].val<a[smallest].val)smallest=r;//父子節點中值最小的位置if(smallest!=i)//父節點最大則不變{CHANGE(i,smallest);//子節點大則交換父子節點MIN_HEAPIFY(smallest);//交換后繼續往下維護} } void BUILD_HEAP(){//建立小根堆int i;for(i=heap_size/2;i>0;i--)MIN_HEAPIFY(i);//自底向上建堆 } int F(int x){return e[x].a*e[x].f*e[x].f+e[x].b*e[x].f+e[x].c; } int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);//while(t--){cin>>n>>m;for(int i=1;i<=n;i++){cin>>e[i].a>>e[i].b>>e[i].c;e[i].f=1;a[i].val=F(i);a[i].x=i;//輸入的順序,第i個被輸進來的}heap_size=n;BUILD_HEAP();for(int i=0;i<m;i++){cout<<a[1].val<<' ';//輸出最小函數值e[a[1].x].f++;//它所在的函數中的"箭頭"往后移a[1].val=F(a[1].x);//"箭頭"變則值變MIN_HEAPIFY(1);//自頂向下維護堆}//}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }?
總結
- 上一篇: Spanning Tree with O
- 下一篇: 堆(Heap)