A 小辰打比赛
解题思路
白给的题,输入后升序排序再遍历,如果a[i]<x
就把他们累加,否则退出循环即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x,a[1000];
cin>>n>>x;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int sum = 0;
for(int i=0;i<n;i++)
{
if(a[i]<x) sum += a[i];
else break;
}
cout<<sum;
return 0;
}
B 小辰的圣剑
解题思路
直接两层循环(双指针也可以)遍历,我们统计枚举的每一段的声望和、消耗的耐久的和如果分别超出u和m,break就好。每次枚举都要更新一下区间长度。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 5500;
typedef long long LL;
LL s1[N],s2[N],a[N],b[N];
int main()
{
LL n,m,u;
cin>>n>>m>>u;
int maxv = 0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++)
{
LL s1=0,s2=0;
for(int j=i;j<=n;j++)
{
s1 += a[j], s2 +=b[j];
if(s1 > m ) break;
if(s2 > u ) break;
maxv = max(maxv,j-i+1);
}
}
cout<<maxv<<endl;
return 0;
}
C 陶陶学算术
解题思路
这么大的数直接乘除肯定会越界,我们可以把所有的除都转换为乘法,把答案ans1
和自己算的数ans2
的乘法都乘到自己身上,除的部分都变成乘积乘到对方身上,请看下图。我们比较ans1
是否等于ans2
直接比较A*D
和B*C
即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e9+9;
typedef int long long;
int n;
signed main()
{
cin>>n;
int op,x;
long long ans1 = 1,ans2 = 1;
while(n--)
{
cin>>op>>x;
if(op==1) ans1 = ans1 * x % N;
else ans2 = ans2 * x % N;
}
cin>>n;
while(n--)
{
cin>>op>>x;
if(op==1) ans2 = ans2 * x % N;
else ans1 = ans1 * x % N;
}
if(ans1==ans2) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
D 小辰的借钱计划
解题思路
首先$期望=V_i * P_i $
不交换的话,期望就为1*a=a
,交换的话,那就是每个符合条件的数乘以他们出现的次数再求和。
符合条件a%i==0 || i%a==0
。最后比较两个的期望,还可以转化一下,把交换的概率放到a的一端,即a*cnt
。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
int m,a;
while(t--)
{
cin>>m>>a;
int sum = 0, cnt = 0;
for(int i=1;i<=m-a;i++)
{
if(a%i==0 || i%a==0)
{
cnt++;
sum += i;
}
}
if(a*cnt<sum) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}