CCPC-Wannafly Winter Camp Div2 Day4 自闭总结

今天拿了队内一血,还是免不了接受被队友carry的命运
A题 简单dp,类似NOIp2000方格取数

#include 
#define LL long long
#define N 100000
using namespace std;
int n,m;
LL dp[N][5];
struct node{
	int x1,x2,y1,y2;
}t[N];
void solve(){
	int x1,x2,y1,y2;
	scanf("%d%d",&t[1].x1,&t[1].y1);
	scanf("%d%d",&t[1].x2,&t[1].y2);
	dp[1][1]=dp[1][2]=0;
	for (int i=2;i<=n;i++)
	{
		scanf("%d%d",&t[i].x1,&t[i].y1);
		scanf("%d%d",&t[i].x2,&t[i].y2);
		dp[i][1] = dp[i-1][1] + abs(t[i].x1-t[i-1].x1) + abs(t[i].y1-t[i-1].y1)
							  + abs(t[i].x2-t[i-1].x2) + abs(t[i].y2-t[i-1].y2);
		dp[i][1] = min(dp[i][1], dp[i-1][2] + abs(t[i].x1-t[i-1].x2)+abs(t[i].y1-t[i-1].y2)
							  + abs(t[i].x2-t[i-1].x1) + abs(t[i].y2-t[i-1].y1) );
		
		dp[i][2] = dp[i-1][2] + abs(t[i].x2-t[i-1].x2) + abs(t[i].y2-t[i-1].y2)
							  + abs(t[i].x1-t[i-1].x1) + abs(t[i].y1-t[i-1].y1);
		dp[i][2] = min(dp[i][2], dp[i-1][1] + abs(t[i].x2-t[i-1].x1)+abs(t[i].y2-t[i-1].y1)
							  + abs(t[i].x1-t[i-1].x2) + abs(t[i].y1-t[i-1].y2) );
	}
	LL ans = min(dp[n][1],dp[n][2]) + abs(t[n].x1-t[n].x2) + abs(t[n].y1-t[n].y2);
	printf("%lld\n",ans);
}
int main(){
	scanf("%d%d",&n,&m);
	solve();
	return 0;
}

C题 最优的解法应该是从节点的度出发,判断YES or NO
D题 数论
F题 经过推导,马走日的最小不可完全遍历的网格为3*4。故判断即可
G题 动态规划
I题 三分 + 贪心策略

你可能感兴趣的:(比赛总结)