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(倍数遍历) - 知乎