您的位置:首页 > 产品设计 > UI/UE

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

2014-05-25 22:23 399 查看
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

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;
}


View Code

G.Grachten

超级大水题。不说了。

(没做出来的以后持续更新)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: