2022.4.20
Codeforces Round #783 (Div. 2)
最近思维很差劲,一开始想错了思路后面就一直卡着想着调就很难回到正轨了,越急越寄。
A - Direction Change
是个找规律题,可以把每个数拆成两部分,如(7,4)可以分成先走(4,4),再走到(7,4)。走到(4.4)所需步数为2*(n-1),剩下步数需要根据m-n的奇偶性来确定,如果是偶数就需要多走一步。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+10,INF=1e9;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int n, m;
cin >> n >> m ;
ll ans = 0;
if(n>m)
swap(n, m);
if(n==1)
{
if(m>2)cout << "-1\n";
else
cout << m - 1 << '\n';
}
else
{
ans = 2 * (n -1) + (m - n) * 2;
if(m-n&1)
ans--;
cout << ans << '\n';
}
}
return 0;
}
B - Social Distance
又想错了思路,想着把首位相连变成字符串一样去处理。结果当然错了,实际上是贪心。对于输入的椅子间隔从小到大排序,间隔最大的可以用来放间隔第二大和第三大的,会把他们包含进去,直到最后的a[1],因此答案就是n+a[2]+...+a[n]+a[n]。加两遍a[n]是因为a[n]左右都可以用来放。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+10,INF=1e9;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int n,m;
cin >> n >> m;
for (int i = 1; i <= n ;i++)
{
cin >> a[i];
}
sort(a + 1, a + 1 + n);
ll ans = n+a[n];
for (int i = 2; i <= n;i++)
{
ans += a[i];
}
if(ans>m)
cout << "no\n";
else
cout << "yes\n";
}
return 0;
C. Make it Increasing
可以发现答案中总有一个数是没有改变的,即为0,时限有2sn为5000我们可以考虑直接暴力枚举哪一位是不操作,为了严格递增,这个数后面第一个数至少为1,第二个数至少为2...,小于这个数的数同理,因此我们可以把满足要求的需要的次数记下来每次遍历取最小值。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=5e3+10,INF=1e9;
ll a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
for (int i = 1; i <= n;i++)
cin >> a[i];
ll ans = 1e18;
for (int i = 1; i <= n;i++)
{
ll res = 0,cnt = 0;
for (int j = i-1; j >=1 ; j--)
{
ll tot = ceil((res-1)*1.0 / -a[j]);
cnt += tot;
res = tot * -a[j];
}
res = 0;
for (int j = i+1; j <=n ; j++)
{
ll tot = ceil((res+1)*1.0 / a[j]);
cnt += tot;
res = tot * a[j];
}
ans = min(ans, cnt);
}
cout << ans;
return 0;
}