打完比赛一直没写,今天有时间就来写写吧。 2014年最后一场CF,不分Div.1&2。感觉挺有纪念意义所以就去机房打了。 之前只是做过CF的题,第一次去机房熬夜打比赛,有点小激动。打的成绩还可以吧,就是没想到A题有个判断写错位置被hack之后来不及改了。B、C题都Ac了。而且还 涨分了,要是A题也Ac了估计能涨很多。 500A - New Year Transportation:
单向搜索。一定要注意结束时判断的位置。
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 #include <iostream> #include <algorithm> #include <string> #include <vector> #include <set> #include <map> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std ;const int maxn=30010 ;int a[maxn];int main () { int n,t,flag; while (scanf ("%d%d" ,&n,&t)!=EOF){ flag=0 ; memset (a,0 ,sizeof (a)); for (int i=1 ;i<n;++i) scanf ("%d" ,&a[i]); int cur=1 ; while (1 ){ if (cur==t){ printf ("YES\n" ); flag=1 ; break ; } if (cur>=n) break ; cur=cur+a[cur]; } if (!flag) printf ("NO\n" ); } return 0 ; }
500B - New Year Permutation:
dfs判连通之后,每个连通的集合内部排序。
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 #include <iostream> #include <algorithm> #include <string> #include <vector> #include <set> #include <map> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std ;const int maxn=310 ;int a[maxn],n,cnt;bool g[maxn][maxn];int vis[maxn];vector <int > num[maxn][2 ];struct pos { int a,b; pos(int a=0 ,int b=0 ):a(a),b(b){} bool operator < (const pos &x) const { return b<x.b; } }; vector <pos> print;void dfs (int u) { for (int v=0 ;v<n;++v) if (vis[v]==-1 &&g[u][v]){ vis[v]=cnt; dfs(v); } return ; } int main () { while (scanf ("%d" ,&n)!=EOF){ memset (a,0 ,sizeof (a)); memset (g,0 ,sizeof (g)); memset (vis,-1 ,sizeof (vis)); for (int i=0 ;i<n;++i) scanf ("%d" ,&a[i]); getchar(); for (int i=0 ;i<n;++i){ for (int j=0 ;j<n;++j) if (getchar()=='1' ) g[i][j]=g[j][i]=true ; getchar(); } cnt=0 ; for (int i=0 ;i<n;++i) if (vis[i]==-1 ){ vis[i]=cnt; dfs(i); ++cnt; } for (int i=0 ;i<n;++i){ num[vis[i]][0 ].push_back(a[i]); num[vis[i]][1 ].push_back(i); } for (int i=0 ;i<cnt;++i){ sort(num[i][0 ].begin(),num[i][0 ].end()); for (int j=0 ;j<num[i][0 ].size();++j) print.push_back(pos(num[i][0 ][j],num[i][1 ][j])); num[i][0 ].clear(),num[i][1 ].clear(); } sort(print.begin(),print.end()); for (int i=0 ;i<print.size();++i){ if (i) printf (" " ); printf ("%d" ,print[i].a); } printf ("\n" ); print.clear(); } return 0 ; }
500C - New Year Book Reading:
模拟,看书的顺序就是堆叠的次序,有了顺序模拟搬书求总重量就行了。
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 #include <iostream> #include <algorithm> #include <string> #include <vector> #include <stack> #include <set> #include <map> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std ;const int maxn=510 ;const int maxm=1010 ;int n,m;int a[maxn],b[maxm];bool read[maxn];vector <int > best;int main () { while (scanf ("%d%d" ,&n,&m)!=EOF){ memset (a,0 ,sizeof (a)); memset (b,0 ,sizeof (b)); memset (read,0 ,sizeof (read)); for (int i=0 ;i<n;++i) scanf ("%d" ,&a[i]); for (int i=0 ;i<m;++i){ scanf ("%d" ,&b[i]); if (!read[b[i]]){ best.push_back(b[i]); read[b[i]]=true ; } } int sum=0 ; for (int i=0 ;i<m;i++){ int j=0 ; while (best[j]!=b[i]) sum+=a[best[j++]-1 ]; best.erase(best.begin()+j); best.insert(best.begin(),b[i]); } printf ("%d\n" ,sum); best.clear(); } return 0 ; }
** 本文迁移自我的CSDN博客 ,格式可能有所偏差。 **