首页 > 其他 > 详细

一周拓展课辅导内容 报告

时间:2020-12-02 17:34:41      阅读:40      评论:0      收藏:0      [点我收藏+]

比赛链接

由于A,B,C太简单了,所以不放思路。

问题 D: 天然气

分析

这题由于白点一定在黑点的右下方,所以可以得到公式 \(X_a - X_b + Y_a - Y_b\) 在由于距离和顺序无关,所以在输入的时候可以直接累加答案

代码

#include <bits/stdc++.h>
 
using namespace std;
 
int x, y;
long long ans = 0;
 
int main () {
     
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> x >> y, ans = ans - x + y;
    for (int i = 1; i <= n; i ++) cin >> x >> y, ans = ans + x - y;
    cout << ans;
     
    return 0;
}

问题 E: 熄灯强化版

分析

这题是一道区间dp题,我们把连续的1的区间记录下来,在逆向循环一遍区间,统计合并的最小值。合并还有一些条件,具体看代码

代码

#include <bits/stdc++.h>
 
using namespace std;

int a[30];
int n, m = 0;
int dp[30][2];
int dis[30], num1 = 0;
 
int main () {
     
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i <= n; i ++) {
    	if (a[i] == 1) {
    		dp[++ m][0] = i;
    		while (a[i] == 1) {
    			i ++;
			}
			dp[m][1] = i;
		}
		if (i == n + 1) break;
	}
	for (int i = m; i >= 1; i --) {
		num1 = 0;
		dis[i] = 100000;
		for (int j = i; j <= m; j ++) {
			num1 += dp[j][1] - dp[j][0];
			int len = dp[j][1] - dp[i][0];
			if (len >= 8) break; //条件1 
			if (len == 6 && a[dp[i][0] + 2] == 1 && a[dp[i][0] + 3] == 1) break; //条件2 
			if (len == 7 && a[dp[i][0] + 3] == 1) break; //条件3 
			int temp = max (4, len) - num1;
			dis[i] = min (dis[i], temp + dis[j + 1]);
		}
	}
	cout << dis[1];
    return 0;
}

一周拓展课辅导内容 报告

原文:https://www.cnblogs.com/binghun/p/14074771.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!