这里是平时水水比赛的流水账式思路记录,如果有值得研究的题则会另写详细题解。
我的个人博客页面(原文链接)
前面陆陆续续打了二十来场都没写点水题记录,今天来一篇。
Problem A - Direction Change
找规律题,到达边后左右或者上下跳动即可,注意不能超过起点终点围成的矩形范围。
void solveAA()
{
int n, m;
cin >> n >> m;
if (n == 1 && m == 1)
{
cout << 0 << endl;
}
else if (m == 1)
{
if (n == 2)
{
cout << 1 << endl;
}
else
{
cout << "-1" << endl;
}
}
else if (n == 1)
{
if (m == 2)
{
cout << 1 << endl;
}
else
{
cout << "-1" << endl;
}
}
else
{
if (n > m)
{
swap(n, m);
}
int dis = m - n;
int ans = m + n - 2;
ans += dis / 2 * 2;
cout << ans << endl;
}
}
void solveA()
{
int t;
cin >> t;
while (t--)
{
solveAA();
}
}
Problem B - Social Distance
这道题比A简单,直接贪心遍历一遍,然后最后一个人要考虑与第一个人在环上的距离即可。
// B
void solveBB()
{
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a.begin(), a.end());
int flag = 1;
int pre = 0;
for (int i = 0; i < n; i++)
{
pre = pre + a[i] + 1;
if (pre > m)
{
flag = 0;
break;
}
if (i == n - 1)
{
if (m - pre + a[0] < a[i])
{
flag = 0;
}
}
}
cout << (flag ? "YES" : "NO") << endl;
}
void solveB()
{
int t;
cin >> t;
while (t--)
{
solveBB();
}
}
Problem C - Make it Increasing
二分贪心想了半天,后来一看数据量5e3,明显是个 O ( N 2 ) O(N^2) O(N2)的暴力算法,由于每一次最多只能选定一点为0,并且选一个0比都不选来的更优,所以可以先遍历每一个点设为0,左右再开遍历简单贪心即可。
思路想的很快,但是实现的时候忘记开ll了,答案和数组都要ll,今晚寝室有点吵,打到这就已经睡觉时间了,遂结束。(吃个教训,数据范围切勿盲目自信)
// C
void solveC()
{
int n;
cin >> n;
vector<ll> a(n), dis(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
ll minn = 0;
for (int i = 0; i < n; i++)
{
vector<ll>b = a;
b[i] = 0;
ll cnt =0;
for(int j=i-1;j>=0;j--){
cnt+=(b[j+1]/b[j]+1);
b[j] = b[j]*(b[j+1]/b[j]+1);
}
for(int j=i+1;j<n;j++){
cnt+=(b[j-1]/b[j]+1);
b[j] = b[j]*(b[j-1]/b[j]+1);
}
if(minn == 0){
minn = cnt;
}
minn = min(minn,cnt);
}
cout<<minn<<endl;
}
。。。考研时间仅当娱乐,不补了。
参考代码:
/*
* @Author: Retr0.Wu
* @Date: 2022-04-19 22:17:14
* @Last Modified by: Retr0.Wu
* @Last Modified time: 2022-04-19 23:58:07
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// A
void solveAA()
{
int n, m;
cin >> n >> m;
if (n == 1 && m == 1)
{
cout << 0 << endl;
}
else if (m == 1)
{
if (n == 2)
{
cout << 1 << endl;
}
else
{
cout << "-1" << endl;
}
}
else if (n == 1)
{
if (m == 2)
{
cout << 1 << endl;
}
else
{
cout << "-1" << endl;
}
}
else
{
if (n > m)
{
swap(n, m);
}
int dis = m - n;
int ans = m + n - 2;
ans += dis / 2 * 2;
cout << ans << endl;
}
}
void solveA()
{
int t;
cin >> t;
while (t--)
{
solveAA();
}
}
// B
void solveBB()
{
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a.begin(), a.end());
int flag = 1;
int pre = 0;
for (int i = 0; i < n; i++)
{
pre = pre + a[i] + 1;
if (pre > m)
{
flag = 0;
break;
}
if (i == n - 1)
{
if (m - pre + a[0] < a[i])
{
flag = 0;
}
}
}
cout << (flag ? "YES" : "NO") << endl;
}
void solveB()
{
int t;
cin >> t;
while (t--)
{
solveBB();
}
}
// C
void solveC()
{
int n;
cin >> n;
vector<ll> a(n), dis(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
ll minn = 0;
for (int i = 0; i < n; i++)
{
vector<ll> b = a;
b[i] = 0;
ll cnt = 0;
for (int j = i - 1; j >= 0; j--)
{
cnt += (b[j + 1] / b[j] + 1);
b[j] = b[j] * (b[j + 1] / b[j] + 1);
}
for (int j = i + 1; j < n; j++)
{
cnt += (b[j - 1] / b[j] + 1);
b[j] = b[j] * (b[j - 1] / b[j] + 1);
}
if (minn == 0)
{
minn = cnt;
}
minn = min(minn, cnt);
}
cout << minn << endl;
}
int main()
{
solveC();
return 0;
}