AtCoder Beginner Contest 373



A - September#

题意#

12个字符串,问长度等于标号的字符串个数。

思路#

模拟。

代码#

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
	int ans = 0;
	for (int i = 0; i < 12; i++)
	{
		string s;
		cin >> s;
		if (s.size() == i + 1)
		{
			ans++;
		}
	}
	cout << ans << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int T = 1;
	//cin >> T;
	while (T--)
	{
		solve();
	}
	return 0;
}

B - 1D Keyboard#

题意#

给从AZ26个英文字母,从A开始,一次走1步,每个字母都要走到,问走到Z要几步。

思路#

模拟。

代码#

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
	string s;
	cin >> s;
	vector<int> v(26);
	for (int i = 0; i < s.size(); i++)
	{
		v[s[i] - 'A'] = i;
	}
	int ans = 0;
	for (int i = 1; i < 26; i++)
	{
		ans += abs(v[i] - v[i - 1]);
	}
	cout << ans << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int T = 1;
	//cin >> T;
	while (T--)
	{
		solve();
	}
	return 0;
}

C - Max Ai+Bj#

题意#

两个长度为n的序列,找出Ai+Bj的最大值。

思路#

两个序列各自的最大值之和就是答案。

代码#

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
	int n, x, maxn1 = LLONG_MIN, maxn2 = LLONG_MIN;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> x;
		maxn1 = max(maxn1, x);
	}
	for (int i = 0; i < n; i++)
	{
		cin >> x;
		maxn2 = max(maxn2, x);
	}
	cout << maxn1 + maxn2 << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int T = 1;
	//cin >> T;
	while (T--)
	{
		solve();
	}
	return 0;
}

D - Hidden Weights#

题意#

n个点,m条边及其边权w,给每个点赋权x,使得xvjxuj=wj,题目保证有解。

思路#

从任意一个顶点开始赋值,然后使用dfs遍历其所有邻点,计算每个顶点的值xvj=xuj+wj

代码#

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int mxn = 1e6 + 5;

int idx;
int to[mxn], nxt[mxn], head[mxn], edge[mxn], ans[mxn];
bool vis[mxn];

void add(int u, int v, int w)
{
    to[++idx] = v;
    edge[idx] = w;
    nxt[idx] = head[u];
    head[u] = idx;
}

void dfs(int u, int val)
{
    vis[u] = true;
    ans[u] = val;
    for (int i = head[u]; i; i = nxt[i])
    {
        int v = to[i];
        if (!vis[v])
        {
            dfs(v, val + edge[i]); //  val_v - val_u = edge[i]
        }
    }
}

void solve()
{
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        u--, v--;
        add(u, v, w);
        add(v, u, -w); // 反向边
    }
    for (int i = 0; i < n; i++) // 遍历所有点,防止不连通
    {
        if (!vis[i])
        {
            dfs(i, 0);
        }
    }
    for (int i = 0; i < n; i++)
    {
        cout << ans[i] << " ";
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int T = 1;
    while (T--)
    {
        solve();
    }
    return 0;
}

E - How to Win the Election#

题意#

n个人竞选,有 k张选票,已知第i个人已经有ai张票。当票比自己多的人<m时能选上。对于第i个人,一定选上输出0,一定选不上输出1,其他输出选上需要的最少额外票数。

思路#

如果n=m,所有人都能选上;否则,对每个人都二分一次进前m个所需票数,再二分一次判断把剩下的票都给别人是否能进前m个(即被选上)。

代码#

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long

int n, m, k;
vector<int> org, a, sum;

bool check(int idx, int mid)
{
	// 第二层二分多少人可以超过当前竞选者
	int cnt = 0, cur = org[idx] + mid, rest = k - mid;
	int p = upper_bound(a.begin() + 1, a.end(), cur) - (a.begin() + 1);
	if (org[idx] < a[n - m + 1]) // idx不在前m大的人当中
	{
		if (p < n - m + 1)
		{
			return false;
		}
		return (p - n + m) * (cur + 1) - (sum[p] - sum[n - m]) > rest; // 让前边每个人的票都比cur多1,看剩下的票够不够
	}
	// 往外扩一个
	return (p - n + m) * (cur + 1) - (sum[p] - sum[n - m - 1]) + org[idx] > rest; // sum里面多减了所以org[idx]要加回来

}

void solve()
{
	cin >> n >> m >> k;
	if (n == m)
	{
		for (int i = 0; i < n; i++)
		{
			cout << "0 ";
		}
		return;
	}
	org.resize(n + 1);
	a.resize(n + 1);
	for (int i = 1; i <= n; i++)
	{
		cin >> org[i];
		k -= org[i]; // k是剩下的票
	}
	a = org;
	sort(a.begin() + 1, a.end());
	sum.resize(n + 1);
	vector<int> ans(n + 1);
	for (int i = 1; i <= n; i++)
	{
		sum[i] = sum[i - 1] + a[i];
	}
	for (int i = 1; i <= n; i++)
	{
		int l = 0, r = k, res = -1;
		while (l <= r) // 第一层二分需要的票数
		{
			int mid = (l + r) >> 1;
			if (check(i, mid))
			{
				res = mid;
				r = mid - 1;
			}
			else
			{
				l = mid + 1;
			}
		}
		ans[i] = res;
	}
	for (int i = 1; i <= n; i++)
	{
		cout << ans[i] << " ";
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int T = 1;
	//cin >> T;
	while (T--)
	{
		solve();
	}

	return 0;
}



比赛链接 https://atcoder.jp/contests/abc373

posted @   _SeiI  阅读(105)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 历时 8 年,我冲上开源榜前 8 了!
· 物流快递公司核心技术能力-海量大数据处理技术
· 四大AI编程工具组合测评
· 关于能否用DeepSeek做危险的事情,DeepSeek本身给出了答案
· 如何在 Github 上获得 1000 star?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示