[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. ...
随机推荐
- 通过ideviceinstaller获取IOS APP bundleId
查看ios设备udid: idevice_id -l 查看ios应用的bundleId: # 安装ideviceinstaller brew install ideviceinstaller # 查看 ...
- Mysql双主双从高可用集群的搭建且与MyCat进行整合
1.概述 老话说的好:瞻前顾后.患得患失只会让我们失败,下定决心,干就完了. 言归正传,之前我们聊了Mysql的一主一从读写分离集群的搭建,虽然一主一从或一主多从集群解决了并发读的问题,但由于主节点只 ...
- C 标准库函数手册摘要
<stdlib.h> int abs( int value ); long int labs( long int value ); 返回参数的绝对值 int rand( void ); v ...
- 【.Net vs Java? 】 看一看二者的类有多像?
1. 包(Package).命名空间(NameSpace) 1.1 概念 在Java中常用的是包(Package),较少提到NameSpace的概念.Java官方文档中这样说: 为了使类型更易于查找和 ...
- 康托展开+逆展开(Cantor expension)详解+优化
康托展开 引入 康托展开(Cantor expansion)用于将排列转换为字典序的索引(逆展开则相反) 百度百科 维基百科 方法 假设我们要求排列 5 2 4 1 3 的字典序索引 逐位处理: 第一 ...
- Noip模拟79 2021.10.17(题目名字一样)
T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
- NorFlash、NandFlash在技术和应用上有些什么区别?
首先你要搞懂什么是Flash Memory? Flash Memory(快闪存储器),是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器.这种科技主要用于一般性数据存储,以及在 ...
- stop: Job failed while stopping start: Job is already running: networking eth0 not configured
再给ubuntu系统重启网络服务的时候出现失败,"stop: Job failed while stopping start: Job is already running: network ...
- hdu 1754 I Hate It(单点更新,区段查最值)
题意: N个成绩.M个操作. Q a b:查询第a个到第b个成绩中最高成绩 U a b:将第a个成绩改成b 思路: 看代码,, 代码: const int maxn = 200010; int max ...