[loj3331]选课

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 50004
4 #define oo 0x3f3f3f3f
5 map<int,int>mat[N];
6 map<int,int>::iterator it;
7 vector<int>vo,ve,w[N],c[N],v[N][4];
8 int V,n,m,x,y,ans,a[N],s[N],vis[105],p[105],sum[105][105],g[105],f[105],ff[105][105],dp[105];
9 void init(int k){
10 vo.clear();
11 for(int i=0;i+1<v[k][1].size();i+=2)vo.push_back(v[k][1][i]+v[k][1][i+1]);
12 for(int i=0;i<v[k][2].size();i++)vo.push_back(v[k][2][i]);
13 sort(vo.begin(),vo.end());
14 for(int i=0;i+1<vo.size();i++)vo[i+1]+=vo[i];
15 ve.clear();
16 for(int i=1;i+1<v[k][1].size();i+=2)ve.push_back(v[k][1][i]+v[k][1][i+1]);
17 for(int i=0;i<v[k][2].size();i++)ve.push_back(v[k][2][i]);
18 sort(ve.begin(),ve.end());
19 for(int i=0;i+1<ve.size();i++)ve[i+1]+=ve[i];
20 }
21 int query_12(int k,int x){
22 if (x<0)return oo;
23 if (x%2==0){
24 if (x==0)return 0;
25 if (vo.size()<x/2)return oo;
26 return vo[x/2-1];
27 }
28 if (!v[k][1].size())return oo;
29 if (x==1)return v[k][1][0];
30 if (ve.size()<x/2)return oo;
31 return ve[x/2-1]+v[k][1][0];
32 }
33 int query_123(int k,int x){
34 int s=0,ans=query_12(k,x);
35 for(int i=0;i<v[k][3].size();i++){
36 s+=v[k][3][i];
37 ans=min(ans,s+query_12(k,x-3*(i+1)));
38 }
39 return ans;
40 }
41 void merge(){
42 memset(ff[0],oo,sizeof(ff[0]));
43 for(int i=0;i<=42;i++)
44 for(int j=0;j<=42;j++)ff[0][min(i+j,s[0])]=min(ff[0][min(i+j,s[0])],f[i]+dp[j]);
45 memcpy(dp,ff[0],sizeof(dp));
46 }
47 void dfs(int k){
48 if (k>V){
49 int tot=0;
50 for(int i=1;i<=V;i++)
51 for(int j=1;j<=V;j++)
52 if ((vis[i])&&(vis[j])){
53 if (sum[i][j]==oo)return;
54 tot+=sum[i][j];
55 }
56 for(int i=1;i<=p[0];i++)
57 for(it=mat[p[i]].begin();it!=mat[p[i]].end();it++)
58 if (vis[(*it).second])tot+=c[p[i]][(*it).first];
59 memcpy(dp,g,sizeof(g));
60 for(int i=1;i<=p[0];i++){
61 int ss=0;
62 for(it=mat[p[i]].begin();it!=mat[p[i]].end();it++)
63 if (vis[(*it).second])ss+=w[p[i]][(*it).first];
64 for(int j=0;j<=42;j++)f[j]=ff[i][j+36-ss];
65 merge();
66 }
67 for(int i=s[0];i<=42;i++)ans=min(ans,tot+dp[i]);
68 return;
69 }
70 vis[k]=0;
71 dfs(k+1);
72 vis[k]=1;
73 dfs(k+1);
74 }
75 int main(){
76 scanf("%d%d",&n,&s[0]);
77 for(int i=1;i<=n;i++){
78 scanf("%d%d",&a[i],&s[i]);
79 for(int j=1;j<=a[i];j++){
80 scanf("%d%d",&x,&y);
81 w[i].push_back(x);
82 c[i].push_back(y);
83 v[i][x].push_back(y);
84 }
85 for(int j=1;j<4;j++)sort(v[i][j].begin(),v[i][j].end());
86 s[0]-=s[i];
87 }
88 s[0]=max(s[0],0);
89 scanf("%d",&m);
90 for(int i=1;i<=m;i++){
91 int p,x1,y1,x2,y2,cc;
92 scanf("%d%d%d%d%d",&p,&x1,&y1,&x2,&y2);
93 if (p==3)cc=oo;
94 else{
95 scanf("%d",&cc);
96 if (p==1)cc=-cc;
97 }
98 if (!mat[x1][y1-1])mat[x1][y1-1]=++V;
99 if (!mat[x2][y2-1])mat[x2][y2-1]=++V;
100 sum[mat[x1][y1-1]][mat[x2][y2-1]]=cc;
101 }
102 memset(dp,oo,sizeof(dp));
103 dp[0]=0;
104 for(int i=1;i<=n;i++)
105 if (!mat[i].size()){
106 init(i);
107 for(int j=0;j<=42;j++)f[j]=query_123(i,j+s[i]);
108 merge();
109 }
110 else{
111 p[++p[0]]=i;
112 for(it=mat[i].begin();it!=mat[i].end();it++){
113 x=(*it).first;
114 v[i][w[i][x]].erase(lower_bound(v[i][w[i][x]].begin(),v[i][w[i][x]].end(),c[i][x]));
115 }
116 init(i);
117 for(int j=-36;j<=42;j++)ff[p[0]][j+36]=query_123(i,j+s[i]);
118 }
119 memcpy(g,dp,sizeof(g));
120 ans=oo;
121 dfs(1);
122 if (ans>=oo)ans=-1;
123 printf("%d",ans);
124 }
[loj3331]选课的更多相关文章
- 从零开始学Python06作业思路:学生选课系统
一,作业要求 选课系统: 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 学生:用户名.密码.性别.年龄.选课列表[].上课记录{课程1:[di,a,]} ...
- python之选课系统详解[功能未完善]
作业需求 思路:1.先写出大体的类,比如学校类,学生类,课程类-- 2.写出类里面大概的方法,比如学校类里面有创建讲师.创建班级-- 3.根据下面写出大致的代码,并实现其功能 遇到的困 ...
- 第一章-第六题(帮人抢票,帮人选课这些软件是否合法 你怎么看?)--By梁旭晖
我觉得这些软件是合法的,符合道德规范的. 计算机当初设计的初衷就是简化甚至替代人类的工作.而软件作为计算机硬件的驱动着,其设计就是体现这些原则. 现在互联网上的订票,选课类型的网站还是有很多的,比如: ...
- Python开发程序:选课系统-改良版
程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
- SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句
附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...
- BFS、DFS与选课问题(拓扑排序)
1选课问题 Leetcode上有这样一道题:有代号0,1,2……n-1的n门课程.其中选择某些课程需要另一些课程作为前提条件.用一组pair来表示这些条件:[1,0],[1,2],表示如果要选修课程1 ...
- Codevs1378选课[树形DP|两种做法(多叉转二叉|树形DP+分组背包)---(▼皿▼#)----^___^]
题目描述 Description 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修 ...
- python实现学生选课系统 面向对象的应用:
一.要求: 选课系统 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 使用pickle保存在文件 学生: 学生:用户名.密码.性别.年龄.选课列表[].上课 ...
- Python开发程序:选课系统
本节作业: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
随机推荐
- springcloud整合config组件
config组件 config组件支持两种配置文件获取方式springcould搭建的微服务的配置文件的获取方式有两种.它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中或者本地 ...
- Java(7)流程控制语句中的for、while、do while循环
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201543.html 博客主页:https://www.cnblogs.com/testero ...
- Microsoft Porject Online 学习随手记一:环境创建和数据导入
没有想像的简单,也没那么复杂 Project OL之前是Dynamics 365 Enterprise P1中的一个模块,目前最新版本只能简单创建并且已经没有Enterprise P1选项. 主要流程 ...
- 离线状态迁移Anaconda虚拟环境
离线状态迁移Anaconda虚拟环境 同样是项目需求,需要布署的服务器上的Anaconda安装到了普通账户下 而后续所有的内容都需要通过root账户进行操作,而服务器已经布署,联网比较麻烦 本文提出, ...
- [技术博客]大闸蟹的技术博客,通过gitlab api进行用户批量创建
技术博客--通过gitlab api批量注册用户 gitlab登录界面本身提供了register功能,但需要手工一个个添加,对于一次性会添加整个班级的学生的软工平台来说并不科学合理.使用gitlab ...
- PCIE学习笔记--TLP Header详解(三)
目录篇地址为:http://blog.chinaaet.com/justlxy/p/5100053481 Completions Completions的TLP Header的格式如下图所示: 这里来 ...
- 数组中出现次数超过一半的数字 牛客网 剑指Offer
数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...
- 『学了就忘』Linux基础命令 — 18、Linux命令的基本格式
目录 1.命令提示符说明 2.命令的基本格式 (1)举例ls命令 (2)说明ls -l命令的 输出内容 1.命令提示符说明 [root@localhost ~] # []:这是提示符的分隔符号,没有特 ...
- SpringCloud微服务实战——搭建企业级开发框架(十三):OpenFeign+Ribbon实现高可用重试机制
Spring Cloud OpenFeign 默认是使用Ribbon实现负载均衡和重试机制的,虽然Feign有自己的重试机制,但该功能在Spring Cloud OpenFeign基本用不上,除非 ...
- 从零开始,无DNS vcenter 6.7 vmotion热迁移,存储集群部署文档。
1,环境准备 准备:Vmware workstation环境 IP地址段规划 ESXI主机IP地址段 192.168.197.4-192.168.197.10 Vcenter Server集群IP地址 ...