scu 4284 Windy's Job

http://cstest.scu.edu.cn/soj/problem.action?id=4284

4284: Windy's Job

Submit your solution     Discuss this problem     Best solutions

Description

Windy has N jobs, the i-th job will cost Windy Pi seconds to finish it, and will get Vi sense of achievement.
Windy want to get at least K sense of achievement, the minimum seconds Windy must pay?

Input

There are many test cases.(the number of test cases <= 150)
For each test case:
The first line contains two integers N and K.
The second line contains N integers Pi.
The third line contains N integers Vi.
There is a blank line after each test case.

1 <= N <= 40
0 <= K <= 1000000000
1 <= Pi, Vi <= 50000000

Output

For each test case output the answer on a single line.If Windy can't get at least K sense of achievement, print -1.

Sample Input

3 6
5 6 10
3 3 6

3 10
5 6 10
3 7 6

3 10
3 5 2
1 3 2

Sample Output

10
11
-1

 

 1 //搜索+剪枝
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 const int maxn = 45;
 8 const int INF = (50000000*40);
 9 struct node
10 {
11     int p,v;
12 }point[maxn];
13 inline int Min(int a,int b)
14 {
15     return a>b?b:a;
16 }
17 int res;
18 void dfs(int pos,int at_least,int n_get,int max_row,int ans,int left,int no_use_min)
19 {
20     if(ans>=res)
21         return ;
22     if(left+n_get<at_least)
23         return;
24     if(n_get>=at_least)
25     {
26         res = Min(ans,res);
27         return;
28     }
29     if(pos==max_row)
30         return ;
31     if(point[pos].p<no_use_min)//特别是这里这个剪枝
32         dfs(pos+1,at_least,(n_get+point[pos].v),max_row,(ans+point[pos].p),(left-point[pos].v),no_use_min);//
33     dfs(pos+1,at_least,n_get,max_row,ans,(left-point[pos].v),(Min(no_use_min,point[pos].p)));//不选
34 }
35 bool cmp(node a,node b)
36 {
37     return a.v>b.v;
38 }
39 int main()
40 {
41     int n,k;
42     int i;
43     while(scanf("%d%d",&n,&k)!=EOF)
44     {
45         int sumP,sumV;
46         sumP = sumV = 0;
47         for(i=0;i<n;i++)
48         {
49             scanf("%d",&point[i].p);
50             sumP+=point[i].p;
51         }
52         for(i=0;i<n;i++)
53         {
54             scanf("%d",&point[i].v);
55             sumV+=point[i].v;
56         }
57         if(sumV<k)
58         {
59             printf("-1\n");
60             continue;
61         }
62         if(sumV==k)
63         {
64             printf("%d\n",sumP);
65             continue;
66         }
67         res = INF;
68         sort(point,point+n,cmp);
69         for(i=0;i<n;i++)
70         {
71             if(point[i].v>=k)
72                 res = Min(res,point[i].p);
73         }
74         dfs(0,k,0,n,0,sumV,INF);
75         printf("%d\n",res);
76     }
77     return 0;
78 }

 

//这是标称做法,分成两堆,一堆枚举,一堆二分

#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 40; const int MaxRes = 1<<20; struct node { int p,v; }point[maxn]; node res1[MaxRes],res2[MaxRes],res3[MaxRes]; void dfs(int S_row,int maxRow,int & cnt,int ansP,int ansV,bool choice,node *res) { if(S_row > maxRow) { res[cnt].p = ansP; res[cnt++].v = ansV; return; } dfs(S_row+1,maxRow,cnt,ansP+point[S_row].p,ansV+point[S_row].v,choice,res); dfs(S_row+1,maxRow,cnt,ansP,ansV,choice,res); } bool cmp(node a,node b) { return a.v>b.v; } int main() { int n,k; int i; while(scanf("%d%d",&n,&k)!=EOF) { int sumP,sumV; sumP = sumV = 0; for(i=0;i<n;i++) { scanf("%d",&point[i].p); // sumP+=point[i].p; } for(i=0;i<n;i++) { scanf("%d",&point[i].v); sumV+=point[i].v; } if(sumV<k) { printf("-1\n"); continue; } if(sumV==k) { printf("%d\n",sumP); continue; } int cnta = 0; dfs(0,((n-1)/2),cnta,0,0,true,res1); int cntb = 0; dfs(((n-1)/2+1),n-1,cntb,0,0,false,res2); sort(res2,res2+cntb,cmp); int cnt = 1; node pre = res2[0]; for(i=1;i<cntb;i++)//这里去重,即是把一定不需要去掉 { if(pre.p>res2[i].p) { pre = res2[i]; res2[cnt++] = res2[i]; } } int ans = 2000000000; for(i=0;i<cnta;i++) { int left = 0; int right = cnt-1; int mid; while(left <= right) { mid = (left+right)>>1; if(res2[mid].v+res1[i].v>=k) { ans = min(res1[i].p+res2[mid].p,ans); left = mid + 1; } else right = mid - 1; } } printf("%d\n",ans); } return 0; }

  

转载于:https://www.cnblogs.com/M-cag/archive/2013/05/02/3054749.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DICOM SCU(Service Class User)是医学影像通信和存储中常用的一个协议,用于向DICOM设备发送请求并接收响应。模拟DICOM SCU是指在测试或开发过程中,使用模拟的SCU设备与其他DICOM设备进行通信和交互。 模拟DICOM SCU主要通过以下步骤实现: 1. 配置模拟SCU设备的参数:包括设备的IP地址、端口号、传输协议等。这些参数需要与要模拟的DICOM设备相匹配。 2. 创建DICOM消息:模拟SCU设备需要根据具体的需求和场景,创建符合DICOM标准的消息。消息包括标识符、数据元素等,用于描述请求或响应的具体内容。 3. 与其他DICOM设备建立连接:模拟SCU设备需要根据配置的参数,与其他DICOM设备建立连接。这一步骤需要遵循DICOM通信协议,例如使用TCP/IP进行传输。 4. 发送DICOM请求:建立连接后,模拟SCU设备可以向其他DICOM设备发送请求。请求的内容取决于具体的操作,可以包括查询、检索、存储等。 5. 接收DICOM响应:模拟SCU设备会等待DICOM设备对请求进行处理,并接收相应的响应消息。响应消息包含了请求的结果,可能是具体的图像或其他数据。模拟SCU设备需要根据响应消息进行进一步的处理。 6. 处理DICOM响应:模拟SCU设备会解析响应消息,提取所需的数据。根据具体的需求,可以对接收到的数据进行进一步分析、显示或存储等处理。 7. 关闭连接:在完成通信后,模拟SCU设备需要关闭与其他DICOM设备的连接,释放资源。 通过模拟DICOM SCU,可以方便地测试和验证DICOM通信的可靠性和兼容性。模拟SCU设备可以用于开发和调试DICOM系统,也可以用于培训医学影像相关的技术人员。 ### 回答2: DICOM SCU(Service Class User)模拟是通过模拟器软件以及相关的测试工具来实现与DICOM设备的通信交互。DICOM是医学图像和通信的标准,它规定了各种医疗设备之间传输和共享医学图像和信息的方式。 DICOM SCU模拟器的主要作用是模拟DICOM设备的行为,以便测试DICOM设备的性能、兼容性和稳定性。通过与DICOM设备进行交互,可以测试设备是否正确地响应DICOM命令、是否能够正确读取和解析DICOM文件、是否能够正确传输DICOM图像等。 DICOM SCU模拟器可以模拟各种DICOM服务类别,例如图像传输、查询检索、存储和打印等。通过模拟这些服务类别,可以测试DICOM设备在各种情况下的性能。 DICOM SCU模拟器通常具有用户友好的界面,可以设置各种DICOM参数,如设备地址、端口号、传输协议、查询条件等。模拟器还可以生成各种测试数据,如模拟各种类型的DICOM图像、模拟不同的设备状态、生成各种DICOM命令等。 DICOM SCU模拟器的使用可以帮助医疗设备制造商进行设备开发和测试,以确保其产品与其他DICOM设备的互操作性。此外,医疗机构也可以使用DICOM SCU模拟器进行设备选择和性能评估,以便为其购买最适合的DICOM设备。 总之,DICOM SCU模拟器是一种重要的工具,用于模拟DICOM设备的行为,以便测试设备的性能和兼容性。它在医疗设备开发、测试和选择中起到重要的作用,有助于提高医疗图像和信息的传输和共享的质量和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值