2014 UESTC 暑前集训队内赛(3) 部分解题报告
B.Battle for Silver
定理:完全图Kn是平面图当且仅当顶点数n<=4.
枚举所有完全图K1,K2,K3,K4,找出最大总权重。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 100000000 int mp[500][500]; int w[500]; int main() { int n,m; int i,j,k,h; int x,y; while(scanf("%d%d",&n,&m)!=EOF) { memset(mp,0,sizeof(mp)); int maxi = 0; for(i=1;i<=n;i++) { scanf("%d",&w[i]); maxi = max(maxi,w[i]); } for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); mp[x][y] = mp[y][x] = 1; maxi = max(maxi,w[x]+w[y]); } for(i=1;i<=n;i++) { for(j=1;j<i;j++) { for(k=1;k<j;k++) { if(mp[i][j] && mp[i][k] && mp[j][k]) { maxi = max(maxi,w[i] + w[j] + w[k]); } else continue; for(h=1;h<k;h++) { if(mp[h][i] && mp[h][j] && mp[h][k]) maxi = max(maxi,w[i]+w[j]+w[k]+w[h]); } } } } printf("%d\n",maxi); } return 0; }
F.First Date
日历题。两个日历有一个初始的对应关系,然后根据这个信息递推,因为闰年计算方式的不同,来得出新的对应关系,暴力枚举1582-10-04(Julian)~9999-12-31(Gregorian)为止,做一个哈希关系存储,最多为(10000-1582)*12*31,约为3131496,不会爆内存。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 100000000 struct node { int y,m,d; node(int Y,int M,int D) { y = Y; m = M; d = D; } node(){} }; int mp[4000000]; int HS(node ka) { int res = (ka.y*12+ka.m-1)*31+ka.d-1; return res; } int JuLeap(int Y) { if(Y%4 == 0) return 1; return 0; } int GreLeap(int Y) { if((Y%4 == 0 && Y%100 != 0) || (Y%400 == 0)) return 1; return 0; } int month_day(int Y,int M,int flag) { if(M == 4 || M == 6 || M == 9 || M == 11) return 30; else if(M != 2) return 31; else if(flag) { if(JuLeap(Y)) return 29; else return 28; } else if(!flag) { if(GreLeap(Y)) return 29; else return 28; } } node add(node ka,int flag) { node kb = ka; if(ka.d+1 > month_day(ka.y,ka.m,flag)) { if(ka.m+1 > 12) { kb.y = ka.y+1; kb.m = 1; kb.d = 1; } else { kb.m = ka.m+1; kb.d = 1; } } else kb.d = ka.d + 1; return kb; } void DOIT() { node ka = node(1582,10,4); node kb = node(1582,10,15); mp[HS(ka)] = HS(kb); int y,m,d; while(kb.y <= 9999) { ka = add(ka,1); kb = add(kb,0); mp[HS(ka)] = HS(kb); } } int main() { int Y,M,D; DOIT(); while(scanf("%d-%d-%d",&Y,&M,&D)!=EOF) { node S = node(Y,M,D); int E = mp[HS(S)]; int day = E%31+1; E/=31; int month = E%12+1; E/=12; int year = E; printf("%04d-%02d-%02d\n",year,month,day); } return 0; }
G.Grachten
超级大水题。不说了。
(没做出来的以后持续更新)
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com