今天拿了队内一血,还是免不了接受被队友carry的命运
A题 简单dp,类似NOIp2000方格取数
#include <bits/stdc++.h>
#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题 三分 + 贪心策略