难度预估

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.小陈爱打铲

入门,组合数学

我们需要从nn个不同奕子中,选出6个不同奕子来组成阵容。 根据高中知识,答案为Cn6C_{n}^6。 注意,由于2006200^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.小柜爱打洲

字符串,思维,贪心

贪心,bb 只取一个字符最优。 只要我们判断中间的字符是否出现在当前元素之或者当前元素之。如果满足任一条件,输出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.小南爱交友

模拟

按题意模拟即可。

即判断b±b24ac2a\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}。 我们将b24acb^2 - 4ac记作Δ\Delta

先判断该方程是否有解。

  • Δ<0\Delta<0时无解,输出NO
  • Δ=0\Delta=0时,有唯一解b2a\frac{-b}{2a}
  • Δ>0\Delta>0时,方程有两不同解。

观察第三种情况。题目需要最大解。对于一元二次方程,最大解与aa的符号有关。

  • a>0a>0时,最大解为b+b24ac2a\frac{-b + \sqrt{b^2 - 4ac}}{2a}
  • a<0a<0时,最大解为bb24ac2a\frac{-b - \sqrt{b^2 - 4ac}}{2a}

随后便是模拟。注意约分、开方、两项合并、10等细节。 具体详见代码。(由于某出题人的懒惰,我们这里只提供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

前缀和

因为坐标范围为1Xi2×1051 \leq X_i\leq 2 \times10 ^ 5,范围较小,我们可以以坐标为下标构建数组,对于同一坐标BOT的血量进行累加。 随后对数组进行前缀和,遍历坐标数组,求sum[i]-sum[i-w]的最大值。 时间复杂度O(n)O(n)

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.小墨爱玩原

思维,贪心

bi=1b_i=1的位置,如果想让ai=bia_i=b_i,那么此时下标[1,i1][1,i-1]此时应该都满足条件。 那么我们只能操作x[1,mini1]x \in [1, \min_{i-1}],其中mini1\min_{i-1}[1,i1][1,i-1]的最小值。 那么最多使得aia_i变成mini1+mini11\min_{i-1}+\min_{i-1}-1。 那么则有ai2×mini1a_i \geq 2 \times \min_{i-1}时无解。 时间复杂度O(n)O(n)

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")

0 条评论

目前还没有评论...