牛客小白月赛18

传送门

A 有一点点不懂

普通欧式素数筛O(n)

#include <iostream>
using namespace std;
#define MAX_N 30000001
#define ll long long
    
bool check[MAX_N] = {0};
ll prime[MAX_N] = {0};
    
ll init(ll n){
    ll count = 0;
    ll ans = 0;
    for(ll i=2;i<=n;i++){
        if(check[i] == 0){
            prime[count] = i;
            ans += i;
            count++;
        }
        for(ll j=0;j<count&&i*prime[j]<=n;j++){
            check[i*prime[j]]++;
            ans += prime[j];
            if(i%prime[j]==0)
                break;
        }
    }
    return ans;
}
    
int main(){
    ll n;
    cin>>n;
    cout<<init(n);
    return 0;
}

C

#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;i++)
#define per(i,a,b) for(ll i=a;i>=b;i--)
using namespace std;
const int maxn = 1e7+5;
ll a[maxn];
inline ll read(){
    register ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return (f==1)?x:-x;
}
int main(){
    ll n,k;
    n=read();
    k=read();
    rep(i,0,n-1){
        a[i]=read();
    }
    sort(a,a+n);
    ll minn=0,maxx=0;
    ll ans=0;
    if(2*k<=n)k=k;//至少每队可以分成2个人
    else k=n-k;//人数不够,尽量分成两队,但是有n-k个人只能一人组队
    rep(i,0,k-1)minn+=a[i];
    per(i,n-1,n-k)maxx+=a[i];
    ans=maxx-minn;
    printf("%lld\n",ans);
 
    return 0;
}
 
/*
进行排序,然后最大和最小一队
所以假设2人一队,
如果说2*k<=n,也就是说,一队不止要两人,但只考虑最大和最小即可
如果2*K>n,也就是说,有些队伍是需要1个人一队的,2k-n是1人1队的人数那么(n-(2k-n))/2=n-k就是2人组队的队数
*/

D

判断4个点是否能组成正方形
4条边相等,且对角线相等,且直角边与对角线符合关系,用set或者vector排序或map
而且注意,尽量别用double,转换为整数比较好

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int x[5],y[5];
int dir[][2]={0,1,0,-1,1,0,-1,0};
int getdis(int x1,int y1,int x2,int y2){
    return pow(x1-x2,2)+pow(y1-y2,2);
}
bool check(){
    std::vector<int> v;
    for(int i=1;i<=4;i++){
        for(int j=i+1;j<=4;j++){
            v.push_back(getdis(x[i],y[i],x[j],y[j]));
        }
    }
    sort(v.begin(),v.end());
    if(v[0]==v[3]&&v[4]==v[5]&&v[4]==2*v[0]&&v[5]!=0)return true;
    else return false;
}
bool change(){
    for(int i=1;i<=4;i++){//点
        for(int j=0;j<4;j++){//方向
            x[i]+=dir[j][0];
            y[i]+=dir[j][1];
            if(check())return true;
            x[i]-=dir[j][0];//回溯
            y[i]-=dir[j][1];
        }
    }
    return false;
}
int main(){
    for(int i=1;i<=4;i++){
        cin>>x[i]>>y[i];
    }
    if(check()){
        printf("wen\n");
    }else if(change()){
        printf("hai xing\n");
    }else{
        printf("wo jue de bu xing\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Emcikem/p/11746608.html