首页 > 代码库 > Codeforces Round #288 (Div. 2) A,B,C,D,E
Codeforces Round #288 (Div. 2) A,B,C,D,E
A:一个一个点向图里面加,判断其所在的位置与其他的点是否可以构成小矩形就可以了。
B:贪心,如果前面的偶数有比他小的就找到一个最靠前的交换,如果前面的偶数都比它小,就找一个最靠后的交换。
C:贪心,把蜡烛尽可能的放在恶魔,来之前,这样可以充分利用蜡烛的时间,模拟一下,不停地向前方就可以了。如果蜡烛时间小于需要的数目,一定不可以。
const int maxn = 2010; int vis[maxn]; int num[maxn]; int main() { int m, t, r; while(cin >>m>>t>>r) { for(int i = 1; i <= m; i++) scanf("%d",&num[i]); if(r > t) { puts("-1"); continue; } int ans = 0; memset(vis, 0, sizeof(vis)); for(int i = 1; i <= m; i++) { int x = num[i]-1; while(vis[num[i]+1000] < r) { for(int k = x-1; k <= x+t; k++) vis[k+1000]++; ans++; x --; } } cout<<ans<<endl; } }
D:欧拉路径+打印路径。
判断欧拉路径的方法是,统计出来他的度(入度+, 出度-)。如果所有的度均为0,或者只有一对度数为(+1,-1)的,那么就可以构成路径。但是这题还必须保证字符串的数目,所以判断之后,还有跑一遍dfs求出长度,判断长度是否满足条件。
打印路径的时候,先dfs再保存边,这样可以保证一开始存的边一定是距离“起点”最远的。
const int maxn = 200010; char str[maxn][10]; int deg[maxn]; int ans[maxn]; int vis[maxn]; int cur[maxn]; vector<pair<int, int> > G[maxn*3]; int cnt; int Get(char x) { if ('0' <= x && x <= '9')return x-'0'; if ('a' <= x && x <= 'z')return x-'a'+10; return x-'A'+36; } int get_x(int x) { return Get(str[x][0])*62+Get(str[x][1]); } int get_y(int y) { return Get(str[y][1])*62+Get(str[y][2]); } void dfs(int x, int y) { int xp; int n = G[x].size(); while(cur[x] < n) { if(!vis[G[x][xp = cur[x]++].second]) { vis[G[x][xp].second] = 1; dfs(G[x][xp].first, G[x][xp].second); } } ans[cnt++] = y; } bool judge(int n) { int x = 0; int y = 0; int pos = get_x(0); for(int i = 0; i < 62*62+100; i++) { if(deg[i] > 1 || deg[i] < -1) return false; if(deg[i] == 1) { x++; pos = i; } if(deg[i] == -1) y++; } if(x != y || x > 1) return false; dfs(pos, -1); cnt--; return cnt >= n; } int main() { int n; while(cin >>n) { memset(cur, 0, sizeof(cur)); memset(vis, 0, sizeof(vis)); memset(deg, 0, sizeof(deg)); cnt = 0; for(int i = 0; i < n; i++) { scanf("%s", str[i]); int x = get_x(i); int y = get_y(i); G[x].push_back(make_pair(y, i)); deg[x]++; deg[y]--; } if(!judge(n)) { cout<<"NO"<<endl; continue; } puts("YES"); printf("%s",str[ans[cnt-1]]); for(int i = cnt-2; i >= 0; i--) printf("%s", str[ans[i]]+2); puts(""); } return 0; } /* 6 abc bca cab cad adc dca */
Codeforces Round #288 (Div. 2) A,B,C,D,E
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。