- FJNU·ACM-25级新手村の第一场世纪大战
题解
- 2025-8-30 16:05:27 @
难度预估
Easy: ACD
Easy-Mid: EBG
Mid: FHI
A.小魏爱打瓦(Easy)
入门,数学
显然,n对2900整除即可。
std
C/C++
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
printf("%d",n/2900);
return 0;
}
Python
n=int(input())
print(n//2900)
B.小陈爱打铲
入门,组合数学
我们需要从个不同奕子中,选出6个不同奕子来组成阵容。
根据高中知识,答案为。
注意,由于的结果超过int
范围,本题需要使用long long
。
std
C/C++
#include<stdio.h>
int main(){
long long n;
scanf("%lld",&n);
long long ans;
if(n<6) ans=0;
else ans=n*(n-1)*(n-2)*(n-3)*(n-4)*(n-5)/720;
printf("%lld",ans);
return 0;
}
Python
n=int(input())
print(n*(n-1)*(n-2)*(n-3)*(n-4)*(n-5)//720)
C.小魏爱送餐
入门,数组
依题意,将数组中的元素依次相加即可。 注意保留两位小数。
std
C/C++
#include<stdio.h>
int n;
const int N=200005;
double a[N];
int main(){
scanf("%d",&n);
double ans=0;
for(int i=1;i<=n;i++){
scanf("%lf",&a[i]);
ans+=a[i];
}
printf("%.2f",ans);
}
Python
n=int(input())
ans=0
a=list(map(float,input().split()))
for i in range(n):
ans+=a[i]
print("{:.2f}".format(ans))
D.小李爱种地
入门,数学,分支结构
首先判断农耕人天赋是否有点,然后依题意模拟即可。
std
C/C++
#include<stdio.h>
int n,f;
int main(){
scanf("%d%d",&f,&n);
if(f==1){
printf("%d",350*(n/400));
}
else{
printf("%d",425*(n/400));
}
}
Python
f,n=map(int,input().split())
if f==1:
ans=350*(n//400)
else:
ans=425*(n//400)
print(ans)
E.小柜爱打洲
字符串,思维,贪心
贪心, 只取一个字符最优。 只要我们判断中间的字符是否出现在当前元素之前或者当前元素之后。如果满足任一条件,输出Yes,反之输出No。
std
C++
#include<bits/stdc++.h>
using namespace std;
int main(){
//建议使用cin cout输入输出时关闭同步流
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
string s;
cin>>s;
vector<int> cnt(26,0);
for(auto c:s) cnt[c-'a']++;
int flag=0;
for(int i=0;i<26;i++){
if(cnt[i]>=3) flag=1;
else if(cnt[i]==2 && (s[0]-'a'!=i || s.back()-'a'!=i)) flag=1;
}
if(flag) cout<<"Yes"<<'\n';
else cout<<"No"<<'\n';
return 0;
}
Python
n = int(input())
s = input()
ww = 1
vis = [0]*26
for i in range(n-1):
x = ord(s[i])-97
if vis[x]:
ww = 0
print("YES")
break
vis[x] += 1
if ww:
vis = [0]*26
for i in range(1,n):
x = ord(s[i]) - 97
if vis[x]:
ww = 0
print("YES")
break
vis[x] += 1
if ww:
print("NO")
F.小南爱交友
模拟
按题意模拟即可。
即判断。 我们将记作。
先判断该方程是否有解。
- 当时无解,输出
NO
。 - 当时,有唯一解。
- 当时,方程有两不同解。
观察第三种情况。题目需要最大解。对于一元二次方程,最大解与的符号有关。
- 当时,最大解为。
- 当时,最大解为。
随后便是模拟。注意约分、开方、两项合并、1
和0
等细节。
具体详见代码。(由于某出题人的懒惰,我们这里只提供cpp代码)
这里列举一些常见的错误输出:(搬自原题解)
0+sqrt(5)
+sqrt(5)
sqrt(8)
sqrt(5)/1
1*sqrt(5)
2*sqrt(5)/4
5/-2
-5/-1
-5/2+3/2
std
C++
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define whiteink signed main
using i64=long long;
i64 gcd(i64 a,i64 b){
return b?gcd(b,a%b):a;
}
i64 m,a,b,c,d,k,t;
void solve(){
cin>>a>>b>>c;
if(a<0) a=-a,b=-b,c=-c;
d=b*b-4*a*c,k=1;
if(d<0){
cout<<"NO"<<endl;
return;
}
for(int i=2;i*i<=d;i++){
while(d%(i*i)==0){
k*=i,d/=(i*i);
}
}
if(d==0||d==1){
t=llabs(gcd(2*a,-b+k*d));
cout<<(-b+k*d)/t;
if(2*a/t!=1){
cout<<'/'<<2*a/t;
}
cout<<endl;
return;
}
t=llabs(gcd(-b,2*a));
if(-b/t!=0){
cout<<-b/t;
if(2*a/t!=1){
cout<<'/'<<2*a/t;
}
cout<<'+';
}
t=llabs(gcd(k,2*a));
if(k/t!=1){
cout<<k/t<<'*';
}
cout<<"sqrt("<<d<<')';
if(2*a/t!=1){
cout<<'/'<<2*a/t;
}
cout<<endl;
}
whiteink(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T=1;
//cin>>T;
cin>>m;
while(T--) solve();
return 0;
}
G.小周爱Rock
入门,数组,排序
依照题意模拟。我们需要选出每天最便宜的店和次便宜的店,即最小值和次小值,在cpp和python中我们可以通过sort快速实现,在c语言中我们也可以通过手打快排实现,但在这里我们选择通过维护最小值和次小值来实现。
std
C
#include<stdio.h>
int main(){
int n,m;
scanf("%d%d",&n,&m);
int sum=0;
for(int i=0;i<n;i++){
int a[m];
int min0=1e8,ans=0,min1=1e8;
for(int j=0;j<m;j++){
scanf("%d",&a[j]);
if(a[j]<min0) min0=a[j],ans=j;
}
a[ans]=1e8;
for(int j=0;j<m;j++) min1=min1<a[j]?min1:a[j];
sum+=min1+min0;
}
printf("%d",sum);
return 0;
}
C++
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int sum=0;
for(int i=0;i<n;i++){
vector<int> a(m+1,0);
for(int j=1;j<=m;j++)
cin>>a[j];
sort(a.begin()+1,a.end());
sum+=(a[1]+a[2]);
}
cout<<sum<<endl;
return 0;
}
Python
n,m = map(int,input().split())
ans = 0
for i in range(n):
a = list(map(int,input().split()))
a.sort()
ans += a[0]+a[1]
print(ans)
H.小欧爱打GO
前缀和
因为坐标范围为,范围较小,我们可以以坐标为下标构建数组,对于同一坐标BOT的血量进行累加。
随后对数组进行前缀和,遍历坐标数组,求sum[i]-sum[i-w]
的最大值。
时间复杂度。
std
c
#include "stdio.h"
int vis[200001],sum[200001];
int main(){
int n,w;
scanf("%d %d",&n,&w);
for(int i=1;i<=n;i++){
int x,b;
scanf("%d %d",&x,&b);
vis[x] += b;
}
for(int i=1;i<=200000;i++){
sum[i] = sum[i-1]+vis[i];
}
int ans = 0;
for(int i=w;i<=200000;i++){
ans = ans>(sum[i]-sum[i-w])?ans:sum[i]-sum[i-w];
}
printf("%d",ans);
return 0;
}
C++
#include<bits/stdc++.h>
using namespace std;
const int maxm=2e5+10;
int n,w,ans=0;
int presum[maxm],a[maxm];
int main(){
scanf("%d%d",&n,&w);
int maxj=0;
for(int i=1;i<=n;i++){
int j,k;
scanf("%d%d",&j,&k);
a[j]+=k;
maxj=max(maxj,j);
}
for(int i=1;i<=200000;i++) presum[i]=presum[i-1]+a[i];
for(int i=1;i<=maxj-w+1;i++) ans=max(ans,presum[i+w-1]-presum[i-1]);
cout<<ans<<endl;
return 0;
}
Python
n,w = map(int,input().split())
vis = [0]*200001
sum = [0]*200001
for i in range(n):
x,b = map(int,input().split())
vis[x] += b
for i in range(1,200001):
sum[i] = sum[i-1]+vis[i]
ans = 0
for i in range(w,200001):
ans = max(ans,sum[i]-sum[i-w])
print(ans)
I.小墨爱玩原
思维,贪心
除的位置,如果想让,那么此时下标此时应该都满足条件。 那么我们只能操作,其中为的最小值。 那么最多使得变成。 那么则有时无解。 时间复杂度。
std
C++
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int inf_int=0x3f3f3f3f;
int n;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
vector<int> b(n+1,0);
for(int i=1;i<=n;i++) cin>>b[i];
int minn=inf_int;
for(int i=1;i<=n;i++){
if(b[i]-minn>=minn && i>1){
cout<<"No"<<endl;
return 0;
}
minn=min(minn,b[i]);
}
cout<<"Yes"<<endl;
}
Python
n = int(input())
a = list(map(int,input().split()))
re = a[0]
for i in range(1,n):
if re*2 <= a[i]:
print("No")
break
re = min(re,a[i])
else:
print("Yes")