0
点赞
收藏
分享

微信扫一扫

Codeforces Round #775 (Div. 2, based on Moscow Open Olympiad in Informatics)

互联网码农 2022-03-12 阅读 58
c++算法

A.Game

Problem - A - Codeforces

前面走到大陆的尽头,后面走到大陆的尽头。最后飞一下就可以

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(void)
{
	int t;
	cin >> t;
	while (t--)
	{
		int n;
		cin >> n;
		int ans = 0;
		vector<int> num;
		num.clear();
		for (int i = 0; i < n; i++)
		{
			int k;
			cin >> k;
			num.emplace_back(k);
		}
		int j = n - 1;
		while (j >= 0 && num[j])
			j--;
		j++;
		int i = 0;
		while (i < n && num[i])
			i++;
		i--;
		if (j > i)
			cout << j - i << endl;
		else cout << 0 << endl;
	}
}

B. Game of Ball Passing

Problem - B - Codeforces

踢球首先要想什么情况下增加球的个数。

比如3,1这种数据,第一轮过后,球员二已经无法踢球了,之后的数据会变成1,0.所以最后需要两个球。极端化去想,将最大的球员数给消耗完,然后判断是否还剩下传球数。其中有个特殊情况,就是都为0,那就必然为0,所以需要立个flag判断一下。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(void)
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        vector<int> num;
        long long int sum=0;
        int flag=1;
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            num.emplace_back(x);
        }
        sort(num.begin(),num.end());
        for(int i=0;i<n;i++)
           {
               if(i!=n-1)
                sum+=num[i];
               if(sum==0&&num[n-1]==0)
                flag=0;
           }
        if(flag)
        {
            if(num[n-1]-sum-1<=0)
                cout<<1<<endl;
            else cout<<num[n-1]-sum<<endl;
        }
        else cout<<0<<endl;
    }
}

C. Weird Sum

Problem - C - Codeforces

这个题本质是个模拟,它的关键加速点在距离算法abs(x1-x2)+abs(y1-y2)。将其分开计算进行相加,不仅可以加速程序还可以避免错位计算的错误(同志们,可以试试一起算会出现啥,你可以试着把事例的每个值的距离和输出来)。

#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
#include<map>
using namespace std;
const int N = 1e5+10;
typedef pair<int, int> pii;
int st[N];
int idex;
int manhaf(int x1, int x2, int y1, int y2)
{
	return abs(x2 - x1) + abs(y2 - y1);
}
bool cmpf(pii p, pii q)
{
	return p.first < q.first;
}
bool cmps(pii p, pii q)
{
	return p.second< q.second;
}
int main(void)
{
	int n, m;
	cin >> n >> m;
	map<int, vector<pii>> num;
	long long int sum = 0;
	map<int, int> mp;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
		{
			int x;
			cin >> x;
			num[x].emplace_back({ i,j });
			if (!mp[x])
			{
				mp[x]++;
				st[idex++] = x;
			}
		}
	for (int i = 0; i < idex; i++)
	{
		int x = st[i];
		vector<pii> t = num[x];
		sort(t.begin(), t.end(), cmpf);
		long long int p = 0;
		for (int j = 1; j < t.size(); j++)
		{
			p = p + j * (t[j].first - t[j - 1].first);
			sum += p;
			//cout << sum << ' ' << t[j - 1].first <<' '<< t[j].first <<' '<< t[j - 1].second <<' '<< t[j].second << endl;
		} 
		sort(t.begin(), t.end(), cmps);
		p = 0;
		for (int j = 1; j < t.size(); j++)
		{
			p = p + j * (t[j].second - t[j - 1].second);
			sum += p;
			//cout << sum << ' ' << t[j - 1].first <<' '<< t[j].first <<' '<< t[j - 1].second <<' '<< t[j].second << endl;
		}
	}
	cout << sum << endl;
}

D. Integral Array

Problem - D - Codeforces

这个题作者没想出来,推荐一个大神的讲解文章。

Codeforces Round #775 Div. 2 D(倍数遍历) - 知乎

举报

相关推荐

0 条评论