hrbust oj 2287 Bridge(最大上升子序列变形)
2015-12-14 16:14
411 查看
水题
题意:给你每座桥的坐标和权值,问每座桥不能相交,但端点可以重复,问最多有多少座桥和在这种情况下最小花费。
思路:对x,y排个序,就是求最大不递减子序列(端点可以取),稍微变形一下,在数量相同的桥里选择,费用最小的。
详细看代码。
#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <list>
#include <ctime>
#include <memory.h>
#include <ctime>
#include <assert.h>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define eps 1e-8
#define M_PI 3.141592653589793
typedef long long ll;
const ll mod=1000000007;
const int inf=99999999;
ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
using namespace std;
ll dp[110000],dpcost[110000];
struct Node
{
ll x,y,v;
}node[110000];
bool cmp(Node a,Node b){
return a.x==b.x ? a.y<b.y : a.x<b.x;
}
int main()
{
int T,cnt=0;cin>>T;
while(T--){
int n;cin>>n;
for(int i=0;i<n;i++) cin>>node[i].x>>node[i].y>>node[i].v;
sort(node,node+n,cmp);
for(int i=0;i<n;i++){
dpcost[i]=node[i].v;
dp[i]=1;
}
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(node[i].y>=node[j].y){
if(dp[i]==dp[j]+1) dpcost[i]=min(dpcost[i],dpcost[j]+node[i].v);
else if(dp[i]<dp[j]+1){//开始这里 直接else w了好几次 写搓了,因为除了这两种,还有可能dp[i]> dp[j]
dp[i]=dp[j]+1;
dpcost[i]=dpcost[j]+node[i].v;
}
}
}
}
ll t=*max_element(dp,dp+n);
ll res=inf;
for(int i=0;i<n;i++){
if(dp[i]==t)
res=min(res,dpcost[i]);
}
printf("Case #%d: %lld %lld\n",++cnt,t,res);
}
}
题意:给你每座桥的坐标和权值,问每座桥不能相交,但端点可以重复,问最多有多少座桥和在这种情况下最小花费。
思路:对x,y排个序,就是求最大不递减子序列(端点可以取),稍微变形一下,在数量相同的桥里选择,费用最小的。
详细看代码。
#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <list>
#include <ctime>
#include <memory.h>
#include <ctime>
#include <assert.h>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define eps 1e-8
#define M_PI 3.141592653589793
typedef long long ll;
const ll mod=1000000007;
const int inf=99999999;
ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
using namespace std;
ll dp[110000],dpcost[110000];
struct Node
{
ll x,y,v;
}node[110000];
bool cmp(Node a,Node b){
return a.x==b.x ? a.y<b.y : a.x<b.x;
}
int main()
{
int T,cnt=0;cin>>T;
while(T--){
int n;cin>>n;
for(int i=0;i<n;i++) cin>>node[i].x>>node[i].y>>node[i].v;
sort(node,node+n,cmp);
for(int i=0;i<n;i++){
dpcost[i]=node[i].v;
dp[i]=1;
}
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(node[i].y>=node[j].y){
if(dp[i]==dp[j]+1) dpcost[i]=min(dpcost[i],dpcost[j]+node[i].v);
else if(dp[i]<dp[j]+1){//开始这里 直接else w了好几次 写搓了,因为除了这两种,还有可能dp[i]> dp[j]
dp[i]=dp[j]+1;
dpcost[i]=dpcost[j]+node[i].v;
}
}
}
}
ll t=*max_element(dp,dp+n);
ll res=inf;
for(int i=0;i<n;i++){
if(dp[i]==t)
res=min(res,dpcost[i]);
}
printf("Case #%d: %lld %lld\n",++cnt,t,res);
}
}
相关文章推荐
- html基础内容的学习
- 第十六周--项目1算法验证冒泡排序
- FAILED BINDER TRANSACTION
- Sharepoint学习笔记--如何定位网站集所在的w3wp进程
- 【第15周 项目2 - 用哈希法组织关键字】
- 自定义ProgressDialog
- 第15周项目2用哈希法组织关键字
- 第15周 项目2 - 用哈希法组织关键字
- IOS开发NSString与int和float的相互转换以及字符串拼接
- 【Android】javadoc, Android注释中添加链接
- JAVA虚拟机的生命周期
- php生成curl命令行的方法
- 使用xUtils做图片下载缓存
- 数据结构练习程序
- 《CSS权威指南(第三版)》---第四章 值和单位
- 用单例连接oracle数据库
- 探讨H5方向与资本热宠
- 重拾信心的第一天,学习HTML
- 第十六周 项目一 验证算法(1) 直接插入排序
- 第十六周——【项目1 - 验证算法】