Contest RankList – 2021ACM俱乐部后备营个人训练赛第15场
问题 A: 校门外的树
Solution
数组+标记就行了。但是这里不得不吐槽,中石油的这个题居然把 3 2 ,这不合法情况都算,在洛谷上的同样的题就不必考虑这种情况。这可能就是为啥大家都是WA了很多次才过的原因叭,害(我WA了三次,麻了)。
Code
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
int i,j,m,l,sum=0;
int a[10001],start,ending;
cin>>l>>m;
for(i=0;i<=l;i++)
a[i]=1;
for(i=0;i<m;i++)
{
cin>>start>>ending;
if(start<ending){
for(j=start;j<=ending;j++)
if(a[j]==1)
a[j]=0;
}
else
{
for(j=ending;j<=start;j++)
if(a[j]==1)
a[j]=0;
}
}
for(i=0;i<=l;i++)
if(a[i]==1)
sum++;
cout<<sum<<endl;
return 0;
}
问题 B: 陶陶摘苹果
Solution
水题。
Code
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a[10];
int count=0;
for(int i=0;i<10;++i)
cin>>a[i];
cin>>n;
for(int i=0;i<10;++i)
{
if(n+30>=a[i])
++count;
}
cout<<count;
return 0;
}
问题 C: 采药
Solution
动态规划,01背包。
Code
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
int n,m,B[1000],v[1000],w[1000];
int i,j;
memset(B,0,sizeof(B));//清零
cin>>n>>m;
for(i=0; i<m; i++)
{
cin>>w[i]>>v[i];//采摘草药时间和草药价值
}
for(i=0; i<m; i++)
{
for(j=n; j>=0; j--)
{
if(B[j]<=B[j-w[i]]+v[i] && j-w[i]>=0 )
{
B[j]=B[j-w[i]]+v[i];
}
}
}
cout<<B[n];
return 0;
}
问题 E: AtCoDeer and Paint Cans
Solution
水题,数组+sort+unique。不会这两个函数的去看—>常用函数(持续更新)
Code
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[3];
for(int i=0;i<3;++i)
cin>>a[i];
sort(a,a+3);
int cnt = unique(a,a+3)-a;
cout<<cnt;
return 0;
}
问题 F: Painting Balls with AtCoDeer
Solution
水题,你列举几种情况就能明白规律。
规律:当有两种颜色时,无论多少个球,都是两种情况;当颜色数目大于两种,情况就有(颜色数*(颜色数-1)的(球数量-1)平方)种。
Code
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,ans=0;
cin>>n>>k;
if(k==2)
{
ans=2;
cout<<ans;
return 0;
}
else
{
ans = k*pow(k-1,n-1);
cout<<ans;
return 0;
}
}
问题 H: AtCoDeer and Rock-Paper
Solution
模拟,你可以假设一下全部都是石头的情况,再想,就比较好懂。
Code
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int p=0,ans=0;
for(int i=0;i<s.length();++i)
{
if(s[i]=='g')
{
if(p>0)
{
++ans;
--p;
}
else
++p;
}
else
{
if(p>0)
--p;
else
{
++p;
--ans;
}
}
}
cout<<ans;
return 0;
}
问题 G: AtCoDeer and Election Report
Solution
题意:每次给出一个比例,要求两个数在不能减少的基础上,以为最小的变化形成这个比例.
让上一次的 x,y 进行:x/y=n*(a/b) (a,b就是题目中的T和A),这里需要求的是n最小能取多少。
可以选择从1开始枚举直到 n * a>=x&&n * b>=y。BUT,如果你这样做,你就是TLE小宝贝。
所以,可以直接让 n=max(x/a,y/b) ,再判断一下n * a与x大小,n * b与y的大小就行.
Code
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
ll n,t;
ll a,b;
ll x=1,y=1;
cin>>t;
while(t--)
{
cin>>a>>b;
n = max(x/a,y/b);
while(n*a<x || n*b<y)
++n;
x = a*n;
y = b*n;
}
cout<<x+y;
return 0;
}