2018.10.31校内测试

这篇博客记录了2018年10月31日的一次校内测试,重点在于分享解决问题的AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任重而道远

Solution:

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

typedef long long ll;
const int N = 1e5 + 5, Mod = 1e9 + 7;
ll n, a, b, sww;
ll l[N], t[N], fac[N << 1], vfac[N << 1];

ll read () {
	ll x = 0, f = 0; char c = getchar ();
	while (!isdigit (c)) f |= (c == '-'), c = getchar ();
	while (isdigit (c)) x = x * 10 + c - '0', c = getchar ();
	return f ? -x : x;
}

ll mpow (ll a, ll b) {
	ll rt = 1;
	for (; b; b >>= 1, a = a * a % Mod)
		if (b & 1) rt = rt * a % Mod;
	return rt;
}

void init () {
	fac[0] = 1, vfac[0] = mpow (fac[0], Mod - 2);
	for (int i = 1; i <= 2 * N; i++) {
		fac[i] = fac[i - 1] * i % Mod;
		vfac[i] = mpow (fac[i], Mod - 2);
	}
}

ll C (ll n, ll m) {
	if (m > n) return 0;
	if (m == 0 || m == n) return 1;
	return fac[n] * vfac[m] % Mod * vfac[n - m] % Mod;
}

int main () {
	freopen ("matrix.in", "r", stdin);
	freopen ("matrix.out", "w", stdout);
	init ();
	n = read (), b = read (), a = read ();
	for (int i = 1; i <= n; i++) l[i] = read ();
	for (int i = 1; i <= n; i++) t[i] = read ();
	for (int i = 2; i <= n; i++) {
		ll tot = n - i + n - 2;
		sww = (sww + b * l[i] % Mod * C (tot, n - 2) % Mod * mpow (a, n - i) % Mod * mpow (b, n - 2) % Mod) % Mod;
		sww = (sww + a * t[i] % Mod * C (tot, n - 2) % Mod * mpow (a, n - 2) % Mod * mpow (b, n - i) % Mod) % Mod;
	}
	printf ("%lld\n", sww);
	return 0;
}

Solution:

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>

const int N = 55;
int n, p, q, sww, tot;
int a[N], dp[N][2005], sum[N];

int read () {
	int x = 0, f = 0; char c = getchar ();
	while (!isdigit (c)) f |= (c == '-'), c = getchar ();
	while (isdigit (c)) x = x * 10 + c - '0', c = getchar ();
	return f ? -x : x;
}

bool check (int x) {
	dp[0][0] = 0;
	for (int i = 0; i < n; i++)
		for (int j = 0; j <= sum[i] / (p + q); j++)
			for (int k = 0; k <= a[i + 1] / p; k++) {
				int m = std :: min ((a[i + 1] - k * p) / q, x - k);
				dp[i + 1][j + k] = std :: max (dp[i][j] + m, dp[i + 1][j + k]);
			}
	return dp[n][x] >= x;
}

int main () {
	freopen ("pq.in", "r", stdin);
	freopen ("pq.out", "w", stdout);
	n = read ();
	for (int i = 1; i <= n; i++) a[i] = read (), sum[i] = sum[i - 1] + a[i];
	p = read (), q = read ();
	if (p < q) std :: swap (p, q);
	for (int all = sum[n] / (p + q); all >= 0; all--)
		if (check (all)) {sww = all; break;}
	printf ("%d\n", sww * (p + q));
	return 0;
}

Solution:

AC代码:

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

struct Node {int v, nex, w;} Edge[200005];
int h[30005], vis[30005], dis[30005], w[30005], t[30005], S[30005], T[30005], tov[30006];
int n, m, nums, numt, stot = 1, tot;

void add(int u, int v, int w) {
	Edge[++stot] = (Node) {v, h[u], w}, h[u] = stot;
}

void Spfa1() {
	queue < int > q;
	memset(vis, 0, sizeof(vis));
	memset(dis, 0x3f3f3f3f, sizeof(dis));
	for(int i = 1; i <= nums; i ++)	q.push(S[i]), vis[S[i]] = 1, dis[S[i]] = min(dis[S[i]], w[S[i]]);
	while(!q.empty()) {
		int u = q.front();	q.pop();	vis[u] = 0;
		for(int i = h[u]; i; i = Edge[i].nex) {
			int v = Edge[i].v;
			if(dis[v] > dis[u] + Edge[i].w && v != 1) {
				dis[v] = dis[u] + Edge[i].w;
				if(!vis[v]) {
					vis[v] = 1;	q.push(v);
				}
			}
		}
	}
}

void Spfa2() {
	queue < int > q;
	memset(vis, 0, sizeof(vis));
	memset(dis, 0x3f3f3f3f, sizeof(dis));
	for(int i = 1; i <= numt; i ++)	q.push(T[i]), vis[T[i]] = 1, dis[T[i]] = min(dis[T[i]], w[T[i]]);
	while(!q.empty()) {
		int u = q.front();	q.pop();	vis[u] = 0;
		for(int i = h[u]; i; i = Edge[i].nex) {
			int v = Edge[i].v;
			if(dis[v] > dis[u] + Edge[i].w && v != 1) {
				dis[v] = dis[u] + Edge[i].w;
				if(!vis[v]) {
					vis[v] = 1;	q.push(v);
				}
			}
		}
	}
}

int main() {
	freopen("graph.in", "r", stdin);
	freopen("graph.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= m; i ++) {
		int u, v, a, b;
		scanf("%d%d%d%d", &u, &v, &a, &b);
		add(u, v, a);	add(v, u, b);
	}
	int ans = 0x3f3f3f3f;
	memset(w, 0x3f3f3f3f, sizeof(w));
	memset(t, 0x3f3f3f3f, sizeof(t));
	for(int i = h[1]; i; i = Edge[i].nex)
		tov[++tot] = Edge[i].v, w[Edge[i].v] = min(w[Edge[i].v], Edge[i].w), t[Edge[i].v] = min(t[Edge[i].v], Edge[i ^ 1].w);
	sort(tov + 1, tov + 1 + tot);
	int M = tov[tot], tt = 0;
	while(M) {
		int tmp = (M & 1);
		nums = 0, numt = 0;
		for(int i = 1; i <= tot; i ++)
			if(((tov[i] >> tt) & 1) == tmp)	S[++nums] = tov[i];
			else	T[++numt] = tov[i];
		Spfa1(); 
		for(int j = 1; j <= numt; j ++) {
			ans = min(ans, t[T[j]] + dis[T[j]]);
		}
		Spfa2();
		for(int j = 1; j <= nums; j ++) {
			ans = min(ans, t[S[j]] + dis[S[j]]);
		}
		M >>= 1, tt ++;
	}
	printf("%d", ans);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值