我是靠谱客的博主 魔幻草莓,这篇文章主要介绍题解:ACM/ICPC 2018亚洲区预选赛北京赛站网络赛Saving Tang Monk IITomb Raider80 DaysK-Dimensional Foil II,现在分享给大家,希望可以做个参考。
Saving Tang Monk II
按气罐数量分层建图跑最短路。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77#include<bits/stdc++.h> #define POS(i,j,k) ((k)*(n)*(m)+(i)*(m)+(j)) using namespace std; typedef int ll; const int INF=1e9; struct Graph { struct Vertex { vector<int> a; }; struct Edge { int from,to; ll dist; }; vector<Vertex> v; vector<Edge> e; Graph(int n):v(n) {} void add(const Edge &ed) { v[ed.from].a.push_back(e.size()); e.push_back(ed); } }; struct Dijkstra:Graph { vector<ll> d; Dijkstra(int n):Graph(n) {} void ask(int s) { d.assign(v.size(),INF); priority_queue<pair<ll,int> > q; for(q.push(make_pair(d[s]=0,s)); !q.empty();) { ll dis=-q.top().first; int u=q.top().second; if(q.pop(),d[u]<dis)continue; for(int i=0,k,to; i!=v[u].a.size(); ++i) if(k=v[u].a[i],to=e[k].to, d[to]>d[u]+e[k].dist) { d[to]=d[u]+e[k].dist; q.push(make_pair(-d[to],to)); } } } }; char s[127][127]; int main() { for(int n,m,sx,sy,tx,ty; ~scanf("%d%d",&n,&m)&&n&&m;) { for(int i=0; i<n; ++i)scanf("%s",s[i]); Dijkstra g(POS(n-1,m-1,5)+1); for(int i=0; i<n; ++i) for(int j=0; j<m; ++j) { for(int k=0,tk,dist=s[i][j]=='#'?2:s[i][j]!='P'; k<6; ++k) if(tk=s[i][j]=='#'?k-1:s[i][j]=='B'?k+1:k,0<=tk&&tk<=5) { if(i)g.add({POS(i,j,k),POS(i-1,j,tk),dist}); if(j)g.add({POS(i,j,k),POS(i,j-1,tk),dist}); if(i+1<n)g.add({POS(i,j,k),POS(i+1,j,tk),dist}); if(j+1<m)g.add({POS(i,j,k),POS(i,j+1,tk),dist}); } if(s[i][j]=='S')sx=i,sy=j; if(s[i][j]=='T')tx=i,ty=j; } g.ask(POS(sx,sy,0)); ll ans=INF; for(int k=0; k<6; ++k) ans=min(ans,g.d[POS(tx,ty,k)]); printf("%dn",ans<INF?ans:-1); } }
Tomb Raider
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58#include<bits/stdc++.h> using namespace std; int n; string s[15],lcs,ans; bool check(string s) { for (int i=0; i<s.size(); ++i) { int h=i,j=0; for (; h!=(i+s.size()-1)%s.size(); h=(h+1)%s.size()) { if (s[h]==lcs[j]) ++j; if (j==lcs.size()) return true; } if (j!=lcs.size() && s[h]==lcs[j]) ++j; if (j==lcs.size()) return true; } return false; } void rep(string &s) { string st,ret=s; for (int i=0; i<s.size(); ++i) { st=s.substr(i)+s.substr(0,i); if (st<ret) ret=st; } s=ret; } int main() { while (cin >> n) { ans=""; for (int i=1; i<=n; ++i) cin >> s[i]; int l=s[1].size(); for (int i=1; i<(1<<l); ++i) { bool ok=true; lcs=""; for (int j=0; j<l; ++j) if (i&(1<<j)) lcs+=s[1][j]; for (int i=2; i<=n; ++i) { if (!check(s[i])) { ok=false; break; } } if (!ok) continue; rep(lcs); if (lcs.size()>ans.size() || lcs.size()==ans.size() && lcs<ans) ans=lcs; } if (ans=="") cout << "0n"; else cout << ans << endl; } }
80 Days
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=1000000+10; int t,n,c,cnt,head; long long a[maxn*2],b[maxn*2]; long long sum; inline int read() { char c=getchar(); while (((c<'0')||(c>'9'))&&(c!='-')) c=getchar(); int x,t; if (c=='-') t=-1,x=0; else x=c-'0',t=1; while (((c=getchar())>='0')&&(c<='9')) x=x*10+c-'0'; return x*t; } int main() { t=read(); while (t--) { n=read(); c=read(); sum=c; for (int i=1; i<=n; i++) a[i+n]=a[i]=read(),sum+=a[i]; for (int i=1; i<=n; i++) b[i+n]=b[i]=read(),sum-=b[i]; if (sum<0) { printf("-1n"); continue; } cnt=1; head=1; sum=c+a[1]-b[1]; while (cnt<n) { while (sum<0) sum=sum-a[head]+b[head],head++,cnt--; sum+=a[head+cnt]-b[head+cnt]; cnt++; } printf("%dn",head); } return 0; }
K-Dimensional Foil II
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; struct P { int x,id; double ans; bool minus; }a[200]; bool cmpx(const P& a,const P& b) { return a.x>b.x; } bool cmpid(const P& a,const P& b) { return a.id<b.id; } int T,n,k,r; int c[200]; int main() { scanf("%d",&T); while (T--) { scanf("%d%d",&n,&k); scanf("%d",&r); for (int i=1;i<=k;++i) scanf("%d",&c[i]); for (int i=1;i<=n;++i) { memset(a,0,sizeof(a)); for (int j=1;j<=k;++j) {scanf("%d",&a[j].x);a[j].id=j;} for (int j=1;j<=k;++j) { a[j].x=a[j].x-c[j]; if(a[j].x<0) {a[j].x=-a[j].x;a[j].minus=true;} } sort(a+1,a+k+1,cmpx); int res=r; for (int j=1;j<=k;++j) { if ((a[j].x-a[j+1].x)*j<=res) { res-=(a[j].x-a[j+1].x)*j; } else { for (int r=1;r<j;++r) a[r].ans=a[r].x-a[j].x; for (int r=1;r<=j;++r) a[r].ans+=double(res)/j; break; } } sort(a+1,a+k+1,cmpid); for (int j=1;j<=k;++j) if (a[j].minus) printf("%.5lf ",-a[j].ans+c[j]); else printf("%.5lf ",a[j].ans+c[j]); puts(""); } } }
最后
以上就是魔幻草莓最近收集整理的关于题解:ACM/ICPC 2018亚洲区预选赛北京赛站网络赛Saving Tang Monk IITomb Raider80 DaysK-Dimensional Foil II的全部内容,更多相关题解:ACM/ICPC内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复