Wiki 1935(美食节-费用流动态加点/边)

本文介绍了一个关于菜品分配的算法问题,旨在通过合理的菜品制作顺序安排,使得顾客的总等待时间达到最小。文章提供了完整的代码实现,并通过具体示例解释了算法的工作原理。

CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节。作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴。他很快就尝遍了美食节所有的美食。然而,尝鲜的欲望是难以满足的。尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人餐桌上的美食是一件无法忍受的事情。于是小M开始研究起了做菜顺序的问题,即安排一个做菜的顺序使得同学们的等待时间最短。小M发现,美食节共有n种不同的菜品。每次点餐,每个同学可以选择其中的一个菜品。总共有m个厨师来制作这些菜品。当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师。然后每个厨师就会同时开始做菜。厨师们会按照要求的顺序进行制作,并且每次只能制作一人份。此外,小M还发现了另一件有意思的事情: 虽然这m个厨师都会制作全部的n种菜品,但对于同一菜品,不同厨师的制作时间未必相同。他将菜品用1, 2, ..., n依次编号,厨师用1, 2, ..., m依次编号,将第j个厨师制作第i种菜品的时间记为 ti,j 。小M认为:每个同学的等待时间为所有厨师开始做菜起,到自己那份菜品完成为止的时间总长度。换句话说,如果一个同学点的菜是某个厨师做的第k道菜,则他的等待时间就是这个厨师制作前k道菜的时间之和。而总等待时间为所有同学的等待时间之和。现在,小M找到了所有同学的点菜信息: 有 pi 个同学点了第i种菜品(i=1, 2, ..., n)。他想知道的是最小的总等待时间是多少。

输入文件的第1行包含两个正整数n和m,表示菜品的种数和厨师的数量。 第2行包含n个正整数,其中第i个数为pi,表示点第i种菜品的人数。 接下来有n行,每行包含m个非负整数,这n行中的第i行的第j个数为ti,j,表示第j个厨师制作第i种菜品所需的时间。 输入文件中每行相邻的两个数之间均由一个空格隔开,行末均没有多余空格。

输出仅一行包含一个整数,为总等待时间的最小值。

3 2 
3 1 1 
5 7 
3 6 
8 9

47

【样例说明】
厨师1先制作1份菜品2,再制作2份菜品1。点这3道菜的3个同学的等待时间分别为3,3+5=8,3+5+5=13。
厨师2先制作1份菜品1,再制作1份菜品3。点这2道菜的2个同学的等待时间分别为7,7+9=16。
总等待时间为3+8+13+7+16=47。
虽然菜品1和菜品3由厨师1制作更快,如果这些菜品都由厨师1制作,总等待时间反而更长。如果按上述的做法,将1份菜品1和1份菜品3调整到厨师2制作,这样厨师2不会闲着,总等待时间更短。
可以证明,没有更优的点餐方案。


【数据规模及约定】
对于100%的数据,n <= 40, m <= 100, p <= 800, ti,j <= 1000(其中p = ∑pi,即点菜同学的总人数)。
每组数据的n、m和p值如下:
测试点编号 n         m            p 
1              n = 5   m = 5     p = 10 
2              n = 40 m = 1     p = 400 
3              n = 40 m = 2     p = 300 
4              n = 40 m = 40   p = 40 
5              n = 5   m = 40   p = 100 
6              n = 10 m = 50   p = 200 
7              n = 20 m = 60   p = 400 
8              n = 40 m = 80   p = 600 
9              n = 40 m = 100 p = 800 
10            n = 40 m = 100 p = 800 

弱菜一开始不会建图,各种被虐。

然后总算会建了(一开始想着拆边,完全忽略还能拆点TNT),动态加边,继续被虐 60分  2 Hit 

给SPFA+ 上了 bool 是否进队判断   90分   3 Hit

被虐被虐被虐被虐。。。。。

研究N次标程后,把SLF 删了 100分 我X

研究结果:SPFA SLF小根 80分    SLF大根 90分    没有SLF 100分

丧心病狂,有人故意卡么。。。


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<cassert>
#include<climits>
#include<queue>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (2139062143)
#define F (1000000009)
#define MAX_N (400+10)
#define MAX_M (100+10)
#define MAX_P (800+10)
#define MAXN (80400+10)
#define MAXM (720000+2600+10)
#define read(x) { \
                while (!isdigit(c=getchar())); \
                x=c-48; \
                while (isdigit(c=getchar())) x=x*10+c-48; \
                }
typedef long long ll;
char c;
int n1,n,s,t,n2,p[MAX_N],tim[MAX_N][MAX_M];
int edge[MAXM],next[MAXM]={0},pre[MAXN]={0},size=1;
ll weight[MAXM],cost[MAXM];
void addedge(int u,int v,int w,int c)
{
   edge[++size]=v;
   weight[size]=w;
   cost[size]=c;
   next[size]=pre[u];
   pre[u]=size;
}
void addedge2(int u,int v,int w,int c){addedge(u,v,w,c),addedge(v,u,0,-c);}
int pre2[MAXN],q[MAXN*8];
int d[MAXN];
int who_cook_num[MAXN][2];
bool b[MAXN]={0};
void SPFA(int s)
{
   memset(d,127,sizeof(d));
   d[s]=0;
   int head=1,tail=1;
   q[1]=s;pre2[s]=0;
   while (head<=tail)
   {
      int now=q[head];b[now]=0;head++;
      Forp(now)
      {
         int &v=edge[p];
         if (weight[p]>0&&edge[p]^s&&d[now]+cost[p]<d[v]) 
         {
            d[v]=d[now]+cost[p];
            pre2[v]=p;
            if (b[v]) continue;b[v]=1;
            /*if (head>1&&d[v]>d[head])
            {
               q[--head]=v;
            }else*/ q[++tail]=v;
         }
      }
                             
   }  
}
ll costflow(int s)
{
   ll totcost=0,totflow=0;
   while(1)
   {
      SPFA(s);if (d[t]==INF) break;
      ll fl=INF,nowcost=0;
      for(int i=t;i^s;i=edge[pre2[i]^1]) fl=min(fl,weight[pre2[i]]),nowcost+=cost[pre2[i]];
      for(int i=t;i^s;i=edge[pre2[i]^1]) weight[pre2[i]]-=fl,weight[pre2[i]^1]+=fl;
      int whos=edge[pre2[t]^1];
      who_cook_num[++n][0]=who_cook_num[whos][0],who_cook_num[n][1]=who_cook_num[whos][1]+1;
      For(i,n1) addedge2(i,n,1,tim[i][who_cook_num[n][0]]*who_cook_num[n][1]);
      addedge2(n,t,1,0);
      totcost+=fl*nowcost;totflow+=fl;      
   }
   return totcost;
}
int main()
{
// freopen("wiki1935.in","r",stdin);
   read(n1) read(n2)
   int S=0;
   For(i,n1)
   {
      read(p[i]);
      S+=p[i];
   }
   n=n1+n2+2,s=n-1,t=n;
   For(i,n1)
   {
      addedge2(s,i,p[i],0);
   }
   For(i,n2)
   {
      addedge2(n1+i,t,1,0);
      who_cook_num[n1+i][0]=i,who_cook_num[n1+i][1]=1;
   }
   
   For(i,n1)
      For(j,n2)
      {
         read(tim[i][j]);
         addedge2(i,j+n1,1,tim[i][j]); 
      }
   
   cout<<costflow(s)<<endl;
   
// while(1);   
   return 0;
}



<think> 我们之前已经讨论过如何使用Python内置的http.server来接收GET请求。现在用户提出了一个具体的需求:接收一个特定路径和参数的GET请求。 路径:/devops-knowledge-management/public-api/v3/wiki/description 参数:sn=WIKI2025061800016 和 user_name=g30021977 我们需要做的是: 1. 在自定义的请求处理器的do_GET方法中,检查请求路径(self.path)是否匹配用户指定的路径。 2. 解析查询参数,提取出sn和user_name的值。 3. 根据路径和参数执行相应的业务逻辑(这里用户没有具体说明业务逻辑,所以我们只返回一个包含这些信息的响应)。 注意:在HTTP中,GET请求的参数是包含在URL中的,格式为:路径?参数1=值1&参数2=值2 例如:/devops-knowledge-management/public-api/v3/wiki/description?sn=WIKI2025061800016&user_name=g30021977 实现步骤: 1. 解析请求路径,将路径和查询字符串分开。 2. 使用urllib.parse模块解析查询字符串,得到一个参数字典。 3. 验证路径是否匹配,然后从参数字典中取出需要的参数。 我们将修改之前的示例代码,使其能够处理这个特定的GET请求。 完整代码示例: </think> ### Python接收指定路径和参数的GET请求方法 要接收路径为 `/devops-knowledge-management/public-api/v3/wiki/description` 且包含参数 `sn=WIKI2025061800016` 和 `user_name=g30021977` 的GET请求,需要实现路径匹配和参数解析功能。以下是完整的解决方案: #### 实现步骤 1. **解析请求路径**:检查 `self.path` 是否匹配目标路径 2. **提取查询参数**:使用 `urllib.parse` 解析URL中的查询字符串 3. **验证必需参数**:检查必需参数是否存在 4. **响应处理**:根据验证结果返回响应 #### 完整代码实现 ```python from http.server import BaseHTTPRequestHandler, HTTPServer from urllib.parse import urlparse, parse_qs import json class DevOpsAPIHandler(BaseHTTPRequestHandler): # 目标路径和参数定义 TARGET_PATH = "/devops-knowledge-management/public-api/v3/wiki/description" REQUIRED_PARAMS = {"sn", "user_name"} def do_GET(self): # 解析URL parsed_url = urlparse(self.path) path = parsed_url.path query_params = parse_qs(parsed_url.query) # 检查路径匹配 if path != self.TARGET_PATH: self.send_response(404) self.send_header('Content-type', 'application/json') self.end_headers() response = {"error": "API endpoint not found"} self.wfile.write(json.dumps(response).encode('utf-8')) return # 验证参数 missing_params = self.REQUIRED_PARAMS - set(query_params.keys()) if missing_params: self.send_response(400) self.send_header('Content-type', 'application/json') self.end_headers() response = { "error": "Missing required parameters", "missing": list(missing_params) } self.wfile.write(json.dumps(response).encode('utf-8')) return # 获取参数值 sn = query_params.get('sn', [''])[0] user_name = query_params.get('user_name', [''])[0] # 构造成功响应 self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() response = { "status": "success", "path": self.TARGET_PATH, "parameters": { "sn": sn, "user_name": user_name }, "message": "Request processed successfully" } self.wfile.write(json.dumps(response).encode('utf-8')) if __name__ == "__main__": server_address = ('', 8080) httpd = HTTPServer(server_address, DevOpsAPIHandler) print(f"API server running on port 8080") print(f"Test URL: http://localhost:8080{DevOpsAPIHandler.TARGET_PATH}?sn=WIKI2025061800016&user_name=g30021977") try: httpd.serve_forever() except KeyboardInterrupt: httpd.server_close() print("Server stopped") ``` #### 代码说明 1. **路径匹配**: - 使用 `urlparse` 解析请求路径 - 检查路径是否匹配目标路径 `/devops-knowledge-management/public-api/v3/wiki/description` - 若不匹配返回404错误 2. **参数验证**: - 使用 `parse_qs` 解析查询字符串 - 检查必需参数 `sn` 和 `user_name` 是否存在 - 若缺少参数返回400错误并列出缺失参数 3. **成功响应**: - 返回JSON格式响应,包含: * HTTP状态码200 * 请求的路径 * 接收到的参数值 * 成功消息 #### 测试方法 1. 运行脚本后,使用浏览器访问: ``` http://localhost:8080/devops-knowledge-management/public-api/v3/wiki/description?sn=WIKI2025061800016&user_name=g30021977 ``` 2. 使用curl命令测试: ```bash curl "http://localhost:8080/devops-knowledge-management/public-api/v3/wiki/description?sn=WIKI2025061800016&user_name=g30021977" ``` 3. 预期响应: ```json { "status": "success", "path": "/devops-knowledge-management/public-api/v3/wiki/description", "parameters": { "sn": "WIKI2025061800016", "user_name": "g30021977" }, "message": "Request processed successfully" } ``` #### 应用场景 这种方法适用于: 1. 接收特定API端点的GET请求 2. 实现参数验证的业务逻辑 3. 构建RESTful API服务 4. Jenkins水线中调用外部API的场景[^2] 5. 知识管理系统接口开发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值