2014 UESTC 暑前集训队内赛(3) 部分解题报告

时间:2022-11-21 14:58:21

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[][];
int w[]; int main()
{
int n,m;
int i,j,k,h;
int x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(mp,,sizeof(mp));
int maxi = ;
for(i=;i<=n;i++)
{
scanf("%d",&w[i]);
maxi = max(maxi,w[i]);
}
for(i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
mp[x][y] = mp[y][x] = ;
maxi = max(maxi,w[x]+w[y]);
}
for(i=;i<=n;i++)
{
for(j=;j<i;j++)
{
for(k=;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=;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 ;
}

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[]; int HS(node ka)
{
int res = (ka.y*+ka.m-)*+ka.d-;
return res;
} int JuLeap(int Y)
{
if(Y% == )
return ;
return ;
} int GreLeap(int Y)
{
if((Y% == && Y% != ) || (Y% == ))
return ;
return ;
} int month_day(int Y,int M,int flag)
{
if(M == || M == || M == || M == )
return ;
else if(M != )
return ;
else if(flag)
{
if(JuLeap(Y))
return ;
else
return ;
}
else if(!flag)
{
if(GreLeap(Y))
return ;
else
return ;
}
} node add(node ka,int flag)
{
node kb = ka;
if(ka.d+ > month_day(ka.y,ka.m,flag))
{
if(ka.m+ > )
{
kb.y = ka.y+;
kb.m = ;
kb.d = ;
}
else
{
kb.m = ka.m+;
kb.d = ;
}
}
else
kb.d = ka.d + ;
return kb;
} void DOIT()
{
node ka = node(,,);
node kb = node(,,);
mp[HS(ka)] = HS(kb);
int y,m,d;
while(kb.y <= )
{
ka = add(ka,);
kb = add(kb,);
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%+;
E/=;
int month = E%+;
E/=;
int year = E;
printf("%04d-%02d-%02d\n",year,month,day);
}
return ;
}

G.Grachten

超级大水题。不说了。

(没做出来的以后持续更新)