2017冬季24集训模拟-1.寻找幽灵

————————————————————————————————————————————题解

把最短路处理出来然后做背包

没有把head数组和all初始化qwq

 1 #include <iostream>
 2 #include <queue>
 3 #include <set>
 4 #include <cstdio>
 5 #include <cstring>
 6 #include <vector>
 7 #include <algorithm>
 8 #define siji(i,x,y) for(int i=x;i<=y;++i)
 9 #define gongzi(j,x,y) for(int j=x;j>=y;--j)
10 #define xiaosiji(i,x,y) for(int i=x;i<y;++i)
11 #define sigongzi(j,x,y) for(int j=x;j>y;--j)
12 #define ivorysi
13 #define inf 0x5f5f5f5f
14 #define mo 97797977
15 #define ha 974711
16 #define ba 47
17 #define fi first
18 #define se second
19 #define pii pair<int,int>
20 typedef long long ll;
21 using namespace std;
22 struct node {
23     int to,next,val;
24 }edge[20005];
25 int head[105],sumedge;
26 int n,m,num[105],all,T,ans;
27 int dist[105],f[20005],vis[105];
28 void add(int u,int v,int c) {
29     edge[++sumedge].to=v;
30     edge[sumedge].next=head[u];
31     edge[sumedge].val=c;
32     head[u]=sumedge;
33 }
34 void spfa(int u) {
35     vis[u]=1;
36     for(int i=head[u];i;i=edge[i].next) {
37         int v=edge[i].to,w=edge[i].val;
38         if(dist[u]+w < dist[v]) {
39             dist[v]=dist[u]+w;
40             if(!vis[v]) {
41                 spfa(v);
42             }
43         }
44     }
45     vis[u]=0;
46 }
47 void init() {
48     scanf("%d%d",&n,&m);
49     int u,v,w;
50     sumedge=0;
51     memset(head,0,sizeof(head));
52     all=0;
53     siji(i,1,m) {
54         scanf("%d%d%d",&u,&v,&w);
55         ++u,++v;
56         add(u,v,w);
57         add(v,u,w);
58     }
59     siji(i,2,n+1) {scanf("%d",&num[i]);all+=num[i];}
60     dist[1]=0;
61     siji(i,2,n+1) dist[i]=inf;
62     spfa(1);
63     f[0]=0;
64     siji(i,1,all) f[i]=inf;
65     ans=inf;
66 }
67 void solve() {
68     scanf("%d",&T);
69     while(T--) {
70         init();
71         siji(i,2,n+1) {
72             if(dist[i]>=inf) continue;
73             gongzi(j,all,num[i]) {
74                 if(f[j-num[i]] < f[j]-dist[i]) {
75                     f[j]=f[j-num[i]]+dist[i];
76                 }
77             }
78         }
79         int half=all/2+1;
80         siji(i,half,all) {
81             if(ans>f[i]) ans=f[i];
82         }
83         if(ans>=inf) puts("impossible");
84         else printf("%d\n",ans);
85     }
86 }
87 int main(int argc, char const *argv[])
88 {
89 #ifdef ivorysi
90     freopen("release.in","r",stdin);
91     freopen("release.out","w",stdout);
92 #else
93     freopen("f1.in","r",stdin);
94 #endif
95     solve();
96     return 0;
97 }
时间: 2024-10-13 12:30:29

2017冬季24集训模拟-1.寻找幽灵的相关文章

2017冬季24集训模拟-3.耀西岛

--------------------------题解 路径的长度是1-200000 然后路径的条数有n*(n+1)/2 根据鸽巢原理n*(n+1)/2 > 200000就一定是YES 所以复杂度只有n^2 1 #include <iostream> 2 #include <queue> 3 #include <set> 4 #include <cstdio> 5 #include <cstring> 6 #include <vec

2017冬季24集训模拟-4.排座椅

--------------------题解 统计这一列或行放通道能隔开几个人,然后贪心 输出没有排序QWQ 1 #include <iostream> 2 #include <queue> 3 #include <set> 4 #include <cstdio> 5 #include <cstring> 6 #include <vector> 7 #include <algorithm> 8 #define siji(i

2017.9.24 noip模拟赛 day2—组合数

简化版题意: 给定n,m(n<=m),求C(n,m)的末尾有几个0 输入格式: 第一行一个整数t,代表数据组数. 接下来t行,每行两个整数n,m 输出格式: t行,每行一个整数,代表C(n,m)的末尾0的个数. 样例输入: 310 111 720 4 样例输出: 110 数据范围: 1<=m<=n<=1000000,t<=1000 首先这道题需要知道一个公式:C(n,m)=n!/(n-m)!*m! 然后10=2*5,也就是说,对于一个数,我们将其因数分解,2和5中较少的数的个

Becoming inspired - ASC - 2017 MARCH 24

Becoming inspired - The 11 questions to ask yourself when you feel uninspired @ Advanced Studio Classroom Vol: 2017 MARCH 24 Maybe you're struggling to find out what it is you care most about. Be struggling to.. To find out + what it is you care most

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

2017.12.24(查找最接近元素等)

2017.12.24  贪心,分治综合习题(2) 1.查找最接近元素 思路:由题可知,n<=100000,m<=10000,如果每一个m都把这个非降序序列扫一遍的话,那么时间复杂的将要到达1010那么多,明显不合题意:所以,只能用二分查找来优化时间复杂度. 核心代码: int left=1,right=n,mid,bz=0; while(left<right-1){ bz=0; mid=(left+right)/2; if(k==num[mid]){ printf("%d\n&

[OI模拟赛]2017.8.24 Day5

A题 第K小的和 Tom有n个数字Ai,每个数字都不?一样.现在,Tom想把这些数字次数的选择,然后 把选定的数字求和,例如: Tom有2个数字,这2个数字分别是:3,5,那么,他能够组成的数字有: 3,5,6,8,9,10,11,12… 现在,他好奇组成的和中,第k?小的是多少,你能告诉他么? 输?入格式: 第?一?行两个正整数n,k表?示Tom?手上数字的个数,以及要求的是第?几?小的数字. 第?二?行n个正整数Ai,表?示Tom?手上每个数字的值. 输出格式: ?一个正整数,表?示第k?小

emWin5.24 VS2008模拟LCD12864 stm32 RTX移植 【worldsing笔记】

? emWin for 12864 并口移植 源代码下载:RTX_emWin5.24_Keil_VS2008-20141122.zip ? 硬件环境: CPU: stm32f103ve LCD:st7920控制器 12864 并口 ? 软件环境: Keil MDK4.74 VS2008 emWin5.24 ? 使用rtx操作系统 ? ? 1.实现emWin5.24在keil 和vs2008同一代码的工程,vs2008目录实现在FMC的官方模拟器上的模拟,Keil目录实现在stm32f103ve

【第二组】项目冲刺(Beta版本)第六次每日例会 2017/7/24

项目冲刺(Beta版本)第六次每日例会 开发小组:Hunter 冲刺经理:林贵渊 小组成员:林轩宇,张太,李明君,刘仁人 1.每日例会内容 (1)昨天做了什么 1.林轩宇:Button音效及服务器相关内容. 2.刘仁人:二维码制作. 3.张太:查找本地内容. 4.李明君:LOGO设计,Button美化. 5.林贵渊:本地内容整理优化. (2)遇到了什么问题 1.图像传输问题(林轩宇) 2.部分功能存在一些小BUG(李明君,林贵渊) 3.控件及界面优化(刘仁人,李明君) 4.玩家交互没有好的构想[