模拟题 day3
出题人: liu_runda
题目名称 摆渡 摆车 背包
源程序文件名 boat.cpp ju.cpp pack.cpp
输入文件名 boat.in ju.in pack.in
输出文件名 boat.out ju.out pack.out
每个测试点时限 1s 1s 1s
内存限制 512MB 512MB 512MB
测试点数目 10 10 10
每个测试点分值 10 10 10
是否打开O2 优化 是 是 是
在windows 下用lemon 进行测试.
摆渡(boat)
【题目描述】
民国时期,在湘西有一位老人摆渡为生.
水道不复杂,也不简单,有n 个渡口,m 条河流连接不同的渡口.每条河流都可以双向通
行,用时也相同.
摆渡的收费是很特别的.
基本费用是按照路程来算.如果总路程为L,就会收取基本费用L.
附加费用是按照经过的渡口的凶险程度来计算,而且只考虑经过的渡口(包括出发的
渡口和终点的渡口)中凶险程度最大的渡口.如果经过的渡口中凶险程度最大为M,就会
收取附加费用M
收取的总费用为L+M.
现在有q 次摆渡,给出每次的起点和终点,问每次摆渡的最少收费是多少.
【输入格式】
第一行三个整数n,m,q
接下来一行n 个数字,依次表示n 个渡口的凶险程度v
接下来m 行,每行三个数字a,b,w 表示渡口a,b 之间有一条长度为w 的河道.
接下来q 行,每行两个数字u,v 表示一次摆渡的起点和终点
【输出格式】
q 行,每行一个整数表示最少的收费.
【样例输入】
5 5 2
1 2 3 4 5
1 2 1
2 3 2
3 4 3
4 5 4
5 1 5
4 1
2 5
【样例输出】
10
11
【数据范围】
第1,2,3 个测试点,所有渡口的凶险程度相同
第4,5,6 个测试点,所有渡口的凶险程度从1 到n 单调不下降
所有数据,n<=300,m<=40000,1<=a,b,u,v<=n,u!=v,a!=b,1<=w<=109.同一对渡口之间可
能连有多条河道.
摆车(ju)
【题目描述】
liu_runda 从前很喜欢下象棋.象棋中的车是很厉害的棋子,如果一个车和另外一个棋
子位于同一行或者同一列,而两个棋子之间又没有其他棋子,车就可以攻击到那个棋子.
现在liu_runda 有一个n 行m 列的棋盘,上面有一些地方摆上了不是车的棋子.他想
知道,怎样才能在棋盘上尽量多地放置车,并使得它们互相之间不攻击?也就是说,怎样才
能选择若干个格子放置车,使得同一行/同一列放置车的位置之间都隔有其他棋子?
【输入格式】
第一行,三个数字n,m,q,分别表示行数,列数和已经摆放的不是车的棋子数目
接下来q 行,每行两个数字a,b,表示a 行b 列放置了一个不是车的棋子.保证这q 个
位置各不相同.
【输出格式】
一行一个整数,表示棋盘上最多能放车的个数.
【样例输入】
3 3 1
2 2
【样例输出】
4
【数据范围】
第1 个测试点,n=1
第2 个测试点,q=0
第3,4,5 个测试点,n*m<=16
对所有的测试点,n<=50,m<=50,q<=1000
背包(pack)
【题目描述】
给出n 个物品,每个物品有重量w[i]和价值v[i]两种属性.
现在要求选出重量不超过m 的物品,使得物品的价值之和最大.
【输入格式】
第一行两个整数n,m 表示物品个数和重量的限制
接下来n 行第i 行两个整数w[i]和v[i],表示第i 种物品的重量和价值
【输出格式】
一行一个整数表示能够获得的最大价值
【样例输入】
3 5
4 5
2 4
3 4
【样例输出】
8
【数据范围】
第1,2,3 个测试点,n<=20,m<=109,w[i]<=109,v[i]<=109
第4,5,6,7 个测试点,n<=500,m<=500,w[i]<=109,v[i]<=109
第8,9,10 个测试点,n<=500,m<=109,w[i]<=109,v[i]<=10

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
//#include<queue>
//#include<set>
#include<bitset>
#include<cassert>
#include<vector>
#define INF (1LL<<60)
#define re register
#define Ii inline int
#define Il inline long long
#define Iv inline void
#define Ib inline bool
#define Id inline double
#define ll long long
#define Fill(a,b) memset(a,b,sizeof(a))
#define R(a,b,c) for(register int a=b;a<=c;++a)
#define nR(a,b,c) for(register int a=b;a>=c;--a)
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define Cmin(a,b) ((a)=(a)<(b)?(a):(b))
#define Cmax(a,b) ((a)=(a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):-(a))
#define D_e(x) printf("&__ %d __&\n",x)
#define D_e_Line printf("-----------------\n")
#define Pause system("pause");
const int N=;
using namespace std;
Ii read(){
int s=,f=;char c;
for(c=getchar();c>''||c<'';c=getchar())if(c=='-')f=-;
while(c>=''&&c<='')s=s*+(c^''),c=getchar();
return s*f;
}
Iv print(ll x){
if(x<)putchar('-'),x=-x;
if(x>)print(x/);
putchar(x%^'');
}
int hurt[N],seq[N];
ll dis[N][N],ans[N][N];
Ib cmp(const int &a,const int &b){
return hurt[a]<hurt[b];
}
int main(){
freopen("boat.in","r",stdin),freopen("boat.out","w",stdout);
int n=read(),m=read(),T=read();
R(i,,n)
hurt[i]=read();
R(i,,n)seq[i]=i;
sort(seq+,seq+n+,cmp);
R(i,,n)
R(j,,n)
if(i!=j)
ans[i][j]=dis[i][j]=INF;
R(i,,m){
int u=read(),v=read(),w=read();
Cmin(dis[u][v],w),
dis[v][u]=dis[u][v];
}
R(p,,n){
int k=seq[p];
R(i,,n)
if(i!=k)
R(j,,n)
if(i!=j&&j!=k)
Cmin(dis[i][j],dis[i][k]+dis[k][j]);
R(i,,n)
R(j,,n)
if(i!=j)
Cmin(ans[i][j],dis[i][j]+Max(Max(hurt[i],hurt[j]),hurt[k]));
}
while(T--)
print(ans[read()][read()]),putchar('\n');
return ;
}

boat.cpp

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
//#include<queue>
//#include<set>
#include<bitset>
#include<cassert>
#include<vector>
#define INF (1ll<<60)
#define re register
#define Ii inline int
#define Il inline long long
#define Iv inline void
#define Ib inline bool
#define Id inline double
#define ll long long
#define Fill(a,b) memset(a,b,sizeof(a))
#define R(a,b,c) for(register int a=b;a<=c;++a)
#define nR(a,b,c) for(register int a=b;a>=c;--a)
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define Cmin(a,b) ((a)=(a)<(b)?(a):(b))
#define Cmax(a,b) ((a)=(a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):-(a))
#define D_e(x) printf("&__ %d __&\n",x)
#define D_e_Line printf("-----------------\n")
#define Pause system("pause");
const int N=;
using namespace std;
Ii read(){
int s=,f=;char c;
for(c=getchar();c>''||c<'';c=getchar())if(c=='-')f=-;
while(c>=''&&c<='')s=s*+(c^''),c=getchar();
return s*f;
}
Iv print(ll x){
if(x<)putchar('-'),x=-x;
if(x>)print(x/);
putchar(x%^'');
}
int a[N][N],b[N][N],tot,head[N*N<<],tim,vis[N*N<<],match[N*N<<];
vector<int>V[N<<];
Ib Hungary(int u){
for(vector<int>::iterator v=V[u].begin();v!=V[u].end();++v)
if(vis[*v]!=tim){
vis[*v]=tim;
if(!match[*v]||Hungary(match[*v])){
match[*v]=u;return ;
}
}
return ;
}
int mp[N][N];
int main(){
//freopen("ju.in","r",stdin),freopen("ju.out","w",stdout);
int n=read(),m=read(),K=read();
R(i,,K)mp[read()][read()]=;
R(i,,n)mp[i][]=mp[i][m+]=;
R(i,,m)mp[][i]=mp[n+][i]=;
R(i,,n)
R(j,,m)
if(!mp[i][j])
tot+=(mp[i][j-]),
a[i][j]=tot;
int tot2=tot;
R(j,,m)
R(i,,n)
if(!mp[i][j])
tot2+=(mp[i-][j]),
b[i][j]=tot2;
R(i,,n)
R(j,,m)
if(!mp[i][j])
V[a[i][j]].push_back(b[i][j]);
//V[b[i][j]].push_back(a[i][j]);
int ans=;
R(i,,tot)
vis[i]=++tim,
ans+=(Hungary(i));//ans+=(!match[i]&&Hungary(i));
print(ans);
return ;
}

ju.cpp

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
//#include<queue>
//#include<set>
#include<bitset>
#include<cassert>
#include<vector>
#define INF (1ll<<60)
#define re register
#define Ii inline int
#define Il inline long long
#define Iv inline void
#define Ib inline bool
#define Id inline double
#define ll long long
#define Fill(a,b) memset(a,b,sizeof(a))
#define R(a,b,c) for(register int a=b;a<=c;++a)
#define nR(a,b,c) for(register int a=b;a>=c;--a)
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define Cmin(a,b) ((a)=(a)<(b)?(a):(b))
#define Cmax(a,b) ((a)=(a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):-(a))
#define D_e(x) printf("&__ %d __&\n",x)
#define D_e_Line printf("-----------------\n")
#define Pause system("pause");
const int N=;
using namespace std;
Ii read(){
int s=,f=;char c;
for(c=getchar();c>''||c<'';c=getchar())if(c=='-')f=-;
while(c>=''&&c<='')s=s*+(c^''),c=getchar();
return s*f;
}
Iv print(ll x){
if(x<)putchar('-'),x=-x;
if(x>)print(x/);
putchar(x%^'');
}
int n,m,c[],w[];
ll sumc[<<],sumw[<<];
Iv work1(){
R(i,,n-)
sumc[<<i]=c[i+],
sumw[<<i]=w[i+];
ll ans=;
R(i,,(<<)-){
int lowbit=i&(-i);
sumc[i]=sumc[lowbit]+sumc[i^lowbit],
sumw[i]=sumw[lowbit]+sumw[i^lowbit];
if(sumc[i]<=m&&sumw[i]>ans)ans=sumw[i];
}
print(ans),
exit();
}
ll f[];
Iv work2(){
R(i,,m)
f[i]=;
R(i,,n)
nR(j,m,c[i])
if(f[j-c[i]]+w[i]>f[j])
f[j]=f[j-c[i]]+w[i];
print(f[m]),
exit();
}
Iv work3(){
int sum=;
R(i,,n)sum+=w[i];
R(i,,sum)f[i]=INF;
R(i,,n)
nR(j,sum,w[i])
if(f[j-w[i]]+c[i]<f[j])
f[j]=f[j-w[i]]+c[i];
int ans=;
while(f[ans+]<=m)++ans;
print(ans),
exit();
}
int main(){
//R(i,0,100)
// printf("%d-> %d, %d\n",i,i&-i,i^(i&-i));
freopen("pack.in","r",stdin),freopen("pack.out","w",stdout);
n=read(),m=read();
R(i,,n)
c[i]=read(),w[i]=read();
if(n<=)work1();
if(m<=)work2();
work3();
return ;
}

pack.cpp

最新文章

  1. 公用表表达式(CTE)递归的生成帮助数据
  2. C#中的new修饰符
  3. XSS攻击的解决方法
  4. mac 下安装jmeter
  5. LuManager 2.0.97 设置shopex 手机版waptouch,绑定二级目录
  6. 记录一款不错的插件fullpage.js
  7. Android Studio导入GitHub上的项目常见问题(有例子)
  8. Java应用发布后,需要关注的7个性能指标
  9. [Java] JAVA程序员您需要学习的25个标准
  10. Python built-in函数的源码实现定位
  11. WdatePicker日历控件使用方法(转)
  12. python 求值表达式解析
  13. Go 语言指向指针的指针
  14. 一场由like引发的事故
  15. Mysql如何进行分组,并且让每一组的结果按照某个字段排序,并且获取每一组的第一个字段
  16. Windows内核驱动中操作文件
  17. 语义分割的简单指南 A Simple Guide to Semantic Segmentation
  18. Django 聚合与查询集API实现侧边栏
  19. 遍历DOM树
  20. DELPHI微信支付代码

热门文章

  1. windows7配置git 免密码登录git服务器
  2. QT学习之窗口部件
  3. 39 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
  4. 51Nod 1554 欧姆诺姆和项链 (KMP)
  5. 关于linq to sql调用存储过程,出现&quot;无法枚举查询结果多次&quot;的问题
  6. 第十六章 IIC协议详解+UART串口读写EEPROM
  7. memcached整理の内存管理及删除机制
  8. 查看iptables状态-重启
  9. Excel转Json工具
  10. Ocelot Consul ACL