uva 11997 priority_queue 應用舉例(超省時間!!!)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3148
Problem K
K Smallest Sums
You're given k arrays, each array has k integers. There are kk ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest sums among them.
Input
There will be several test cases. The first line of each case contains an integer k (2<=k<=750). Each of the following k lines contains k positive integers in each array. Each of these integers does not exceed 1,000,000. The input is terminated by end-of-file (EOF). The size of input file does not exceed 5MB.
Output
For each test case, print the k smallest sums, in ascending order.
Sample Input
3 1 8 5 9 2 5 10 7 6 2 1 1 1 2
Output for the Sample Input
9 10 12 2 2
Rujia Liu's Present 3: A Data Structure Contest Celebrating the 100th Anniversary of Tsinghua University
Special Thanks: Yiming Li
Note: Please make sure to test your program with the gift I/O files before submitting!
題目大意:有K個元素,在每個陣列裡取出一個元素加起來,可以得到k^k個和。求這些和中最小的k個數
解題思路:大白書第189頁,字數太多,我就不敲了。這種寫法的複雜度是K*K*logK,暴力遍歷的話會是k^K,一定會超時的
/**
暴力來寫時間複雜度為k^k,是難以接受的,利用本題的解題思路複雜度將為K*K*logK
**/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct Item
{
int s,b;//s=A[a]+B[b];這裡的a並不重要,因此不儲存
Item(int _s,int _b)
{
s=_s;
b=_b;
}
bool operator<(const Item&rhs)const
{
return s>rhs.s;
}
};
void merge(int *A,int *B,int *C,int n)
{
priority_queue <Item> q;
for(int i=0;i<n;i++)
q.push(Item(A[i]+B[0],0));
for(int i=0;i<n;i++)
{
Item item=q.top();q.pop();//取出A[a]+B[b];
C[i]=item.s;
int b=item.b;
if(b+1<n)q.push(Item(item.s-B[b]+B[b+1],b+1));
//加入A[a]+B[b+1]=s-B[b]+B[b+1];
}
}
const int maxn=768;
int A[maxn][maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
scanf("%d",&A[i][j]);
sort(A[i],A[i]+n);
}
for(int i=1;i<n;i++)
merge(A[0],A[i],A[0],n);
printf("%d",A[0][0]);
for(int i=1;i<n;i++)
printf(" %d",A[0][i]);
printf("\n");
}
return 0;
}
相關文章
- SQLLOAD應用舉例SQL
- ngnix使用超時響應時間配置避坑一例
- 設計模式應用舉例設計模式
- golang Context應用舉例GolangContext
- Infinum:開發iOS應用要比開發Android應用節省約30%時間iOSAndroid
- Lotus C API Extension Manager 應用舉例API
- oracle rollup,cube子句的應用舉例;Oracle
- 時間複雜度計算和舉例說明時間複雜度
- AC-DMIS測量程式應用舉例
- 並查集(Union-Find) 應用舉例並查集
- WebSphere Remote Server 簡介及其應用舉例WebREMServer
- PHP的時間日期與例項應用:日曆核心程式PHP
- C++繼承性應用例項 日期和時間(轉)C++繼承
- 正規表示式理解及簡單應用舉例
- 樂觀鎖與悲觀鎖及應用舉例
- 再談多型--多型的應用舉例: (轉)多型
- R語言中管道符號 %>% 的應用 及 舉例R語言符號
- 給 Angular 伺服器端渲染應用設定一個渲染超時時間Angular伺服器
- Oracle裡時間的應用Oracle
- 並查集(Union-Find) 應用舉例 --- 基礎篇並查集
- 應用連線超時排查DB MySQLMySql
- 暴力列舉- uva11464 - Even Parity
- 安卓應用修改系統時間安卓
- unity+時間戳的應用Unity時間戳
- 輕鬆搭建基於 Serverless 的 Go 應用(Gin、Beego 舉例)ServerGo
- Python偏函式應用舉例-路燈指示牌Python函式
- mssql sqlserver in 關鍵字在值為null的應用舉例SQLServerNull
- 常用的Linux可插拔認證模組(PAM)應用舉例Linux
- Android底層字元傳遞給上層應用舉例Android字元
- 執行緒池的實現原始碼及應用舉例執行緒原始碼
- 例說資料結構&STL(七)——priority_queue資料結構
- eMarketer:手機使用者玩遊戲的時間超過其他手機應用遊戲
- Tomcat應用報redis超時的故事TomcatRedis
- websphere 應用超時問題的解決Web
- (UVA - 10976)Fractions Again?!(技巧,暴力列舉)FractionAI
- UVA 11464 Even Parity(部分列舉 遞推)
- session超時時間的設定Session
- weblogic設定超時時間Web