前言:

这次月赛状态不错,开了四题,上了一大波分,感觉刷题网站要成为ai✌的玩具了(悲悲!!)


A.冰冰的正多边形

先统计各种木棍的长度,最小的多边形肯定是三嘛,然后就枚举看看有没有超过三的,没有就直接输出no,如果有那最小肯定就是正三角了,直接输出3*i , i是长度为i的木棍

void solve(){
    int n;
    cin>>n;
    vector<int> a(n+1,0);
    for(int i=1;i<=n;i++) cin>>a[i];
    map<int,int> q;
    for(int i=1;i<=n;i++){
        q[a[i]]++;
    }
    int op = 0;
    for(int i=1;i<=100;i++){
        if(q[i]>=3){
            op = 1;
        }
    }
    if(op==0){
        cout<<"NO"<<endl;
    }
    else{
        cout<<"YES"<<endl;
        int m = 0;
        for(int i=1;i<=100;i++){
            if(q[i]>=3){
                m = 3*i;
                break;
            }
        }
        cout<<m<<endl;
    }
}

B.冰冰的电子邮箱

一个小(中(大))模拟,考的是基本功,做不出来的还是要多练习。。。

void solve(){
    string s;
    cin>>s;
    string l,d;
    int op = 0;

    for(int i=0;i<s.length();i++){
        if(s[i]=='@'){
            op = 1;
        }
    }

    if(op==0){
        cout<<"No"<<endl;
        return;
    }
    int cp = -1;
    for(int i=0;i<s.length();i++){
        if(s[i]=='@'){
            cp = i;
            break;
        }
        l = l + s[i];
    }
    for(int i=cp+1;i<s.length();i++){
        d = d + s[i];
    }
    if(l.length()>64 || l.length()<1){
        cout<<"No"<<endl;
        return;
    }
    if(l[0]=='.' || l[l.length()-1]=='.'){
        cout<<"No"<<endl;
        return;
    }

    for(int i=0;i<l.length();i++){
        if((l[i]<='9' && l[i]>='0') || (l[i]>='a' && l[i]<='z') ||
            (l[i]>='A' && l[i]<='Z') || l[i]=='.'){
            continue;
        }
        else{
            cout<<"No"<<endl;
            return;
        }
    }

    if(d.length()>255 || d.length()<1){
        cout<<"No"<<endl;
        return;
    }

    if(d[0]=='.' || d[d.length()-1]=='.'){
        cout<<"No"<<endl;
        return;
    }
    if(d[0]=='-' || d[d.length()-1]=='-'){
        cout<<"No"<<endl;
        return;
    }

    for(int i=0;i<d.length();i++){
        if((d[i]<='9' && d[i]>='0') || (d[i]>='a' && d[i]<='z') ||
            (d[i]>='A' && d[i]<='Z') || d[i]=='.' || d[i]=='-'){
            continue;
        }
        else{
            cout<<"No"<<endl;
            return;
        }
    }
    cout<<"Yes"<<endl;
}

C 冰冰的异或

一眼看到题目,觉得是二进制,想了想应该是找规律,遂而开始打标,惊讶发现

1 2 3 4 5 6 7 8 9 10

1 1 4 4 8 8 8 8 16 16

有规律,直接模拟规律做即可,找 是属于第几部分的,然后直接Pow就行

个人觉得这题cf的div2B的难度

using LL = long long;
void solve(){
    LL n;
    cin>>n;
    if(n==1 || n==2){
        cout<<1<<endl;
        return;
    }
    LL cp = 1;
    LL cnt = 0;
    while(n-1>0){
        n -= cp;
        cp*=2;
        cnt ++;
    }
    LL sum = pow(2,cnt);
    cout<<sum<<endl;
}

D. 冰冰的分界线

第一次用了double做卡了精度,这题最后还是考察数学,推数学公式即可 Ax+By+C=0;

用x1,x2,y1,y2 表示A,B,C

使用距离之和公式求解

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
LL gcd(LL x,LL y){
    return y==0 ? x:gcd(y,x%y);
}
void solve(){
    int n;
    cin>>n;
    vector<int> x(n+1,0),y(n+1,0);
    for(int i=1;i<=n;i++) cin>>x[i];
    for(int i=1;i<=n;i++) cin>>y[i];
    LL ans = 0;
    map<tuple<LL,LL,LL>,int> q;//用map来记录是否出现过
    for(int i=1;i<n;i++){
        for(int j=i+1;j<=n;j++){
            LL A = 0 ,B = 0, C = 0;
            A = 1ll*2*(x[j] - x[i]);
            B = 1ll*2*(y[j] - y[i]);
            C = 1ll*x[i]*x[i]-1ll*x[j]*x[j] + 1ll*y[i]*y[i] - 1ll*y[j]*y[j];
            LL g = gcd(A,gcd(B,C));
            if(g!=0){//系数的加倍任然是同一条直线,所以要考虑除掉最大公因数
                A = A/g;
                B = B/g;
                C = C/g;
            }
            if(A<0 || (B<0 && A==0)){//负数可以变为整数,也是可能是同一条线,这里也要考虑
                A = -A;
                B = -B;
                C = -C;
            }
            if(!q[{A,B,C}]){//最后存就可以了,规避精度问题,转化为三个数值的问题,强!!!
                ans++;
                q[{A,B,C}]=1;
            }
        }
    }
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}