A - Coins CodeForces - 1061A
上来先把题目看错。。。我以为要求所有满足的个数,没想到求满足的数字的最小的个数。这样直接套一个整除即可
代码(算法四行)
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,s;
cin>>n>>s;
if(s%n==0)
cout<<s/n;
else
cout<<s/n+1;
}
B - Views Matter CodeForces - 1061B
自己把自己搞晕的一道题,实际上排个序会变得简单明了。具体的步骤凯哥已经说清楚了,这里我提供一下我自己的简单的实现凯哥思路的方法
①首先输入排序这个没有什么区别
②记录一下最高能到多高,这个意思是说如果升序排序的时候右边比左面高,那么高度加一如果高度相同,那么高度不变
③最后的剩余的个数就是用列数n+right(最大高度)-目前的高度,然后输出原来的总数-剩余的即可。这样代码量也不是很大
④注意用long long!!!
代码
#include <bits/stdc++.h>
using namespace std;
long long num[100005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long n,m,sum=0,t=0,re=0;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>num[i],re+=num[i];
sort(num,num+n);
for(int i=0;i<n;i++)
if(num[i]>t)
t++;
sum=n+(num[n-1]-t);
cout<<re-sum;
}
C - Vasya and Book CodeForces - 1082A
这个玩意我上来就bfs,一看这个不是bfs模板题吗。然后无助的卡在第七个点tle。实际上这个东西因为边界的问题是可以找规律的。具体的解法林姐也说的挺清楚的了,我这里提供一下我的实现方法
总共有三种情况
①直接能够到达
②通过1中转
③通过n中转
其中②和③还得注意中转之前的那些步数也得算上。然后判断一下如果条件都不符合那么肯定是不行的。如果条件符合求个最小值即可
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n,x,y,d,ans1=0,ans2=0,ans3=0,ans=INT_MAX,f=0,ff=0,fff=0;
cin>>n>>x>>y>>d;
if(abs(x-y)%d==0)//第一种情况
{
f=1;
ans1=abs(x-y)/d;
ans=min(ans,ans1);
}
if((y-1)%d==0)//第二种情况
{
ff=1;
if((x-1)%d==0)
ans2+=(x-1)/d;
else
ans2+=(x-1)/d+1;
ans2+=(y-1)/d;
ans=min(ans,ans2);
}
if((n-y)%d==0)//第三种情况
{
fff=1;
if((n-x)%d==0)
ans3+=(n-x)/d;
else
ans3+=(n-x)/d+1;
ans3+=(n-y)/d;
ans=min(ans,ans3);
}
if(!f&&!ff&!fff)
cout<<-1<<"\n";
else
cout<<ans<<"\n";
}
}
D - Vova and Trophies CodeForces - 1082B
又是这种我不擅长的模拟题。。。
思路也是看了凯哥(完全复读)
①预处理一下,把两边都加上一个S
②扫一遍找到串中S的下标所在
③判断情况
(1)如果里面只有预处理的两个那么肯定原串没有S,所以直接输出原串长度即可
(2)如果里面比预处理多了一个S,那么肯定原串里面肯定是只有一个S的。显然这样直接输出原串-1
(3)如果原串里面有多个S那么需要对每三个S进行一次判断。因为这个题的规律就是供给或者内销。供给就是这三个S卡的G是否可以从外面换进一个G或者内销就是把原来不相连的G相连
(3).1这个地方还有一个判断的问题。如果我们直接判断位置的话那是不行的。因为可能串的后面都是S也说不定呢。。。
(3).2这个地方凯哥用的方法是直接判断剩余的S与剩余的串的字符的个数进行比较。如果剩余的S少,那么说明可以供给,否则只能内销
(3).2的代码
if(vac.size()-3<n+1-(vac[i]-vac[i-2]))
ans=max(ans,vac[i]-vac[i-2]-1);
else
ans=max(ans,vac[i]-vac[i-2]-2);
完整代码
#include <bits/stdc++.h>
using namespace std;
vector<int> vac;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,ans=-1;
cin>>n;
string a;
cin>>a;
vac.push_back(0);
for(int i=0;i<a.size();i++)
if(a[i]=='S')
vac.push_back(i+1);
vac.push_back(n+1);
if(vac.size()==2)
cout<<n;
else if(vac.size()==3)
cout<<n-1;
else
{
for(int i=2;i<vac.size();i++)
{
if(vac.size()-3<n+1-(vac[i]-vac[i-2]))
ans=max(ans,vac[i]-vac[i-2]-1);
else
ans=max(ans,vac[i]-vac[i-2]-2);
}
cout<<ans;
}
}