T1T1 占卜DIY

思路:模拟题,注意用双端队列二维数组。

代码:

#include<bits/stdc++.h>
using namespace std;
struct P{
    bool vis;
    int num;
};
deque<P> a[20];
int vis[100];
int main(){
    P st;
    for (int i=1;i<=13;i++){
        for (int j=1;j<=4;j++){
        	char l;
            cin >> l;
            if(l=='A'){
                st.num=1;
                st.vis=0;
                a[i].push_front(st);
            }else if(l=='J'){
                st.num=11;
                st.vis=0;
                a[i].push_front(st);
            }else if(l=='Q'){
                st.num=12;
                st.vis=0;
                a[i].push_front(st);
            }else if(l=='K'){
                st.num=13;
                st.vis=0;
                a[i].push_front(st);
            }else if(l=='0'){
                st.num=10;
                st.vis=0;
                a[i].push_front(st);
            }else{
                st.num=l-'0';
                st.vis=0;
                a[i].push_front(st);
            }
        }
    }
    P top;
    P top2;
    for (int t=0;t<4;t++){
        top=a[13].back();
        a[13].pop_back();
        top.vis=1;
        if(top.num==13) continue;
        while(top.num!=13){
            a[top.num].push_back(top);
            top2=top;
            top=a[top.num].front();
            a[top2.num].pop_front();
            top.vis=1;
        }
    }
    for (int i=1;i<=13;i++){
        for (int j=0;j<a[i].size();j++){
            if(a[i][j].vis) vis[a[i][j].num]++;
        }
    }
    int ans=0;
    for(int i=1;i<=12;i++){
        if(vis[i]==4) ans++;
    }
    cout << ans << endl;
}

T2T2 袭击

思路:一题平面最近点对的变形题,注意用vis数组标注好阵营,最后判断时,如果vis值一样,则将距离设为无穷大,其余遵循平面最经典对的求法。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+50;
struct PII{
    double x,y;
    bool vis;
    bool operator<(const PII &T) const{
        return x<T.x;
    }
};
PII a[N],tmp[N];
double dist(PII a,PII b){
  //依赖于归并的平面最近点对
    if(a.vis==b.vis) return 2e9;
    double _x=a.x-b.x,_y=a.y-b.y;
    return sqrt(_x*_x+_y*_y);
}
double dfs(int l,int r){
    if(l>=r) return 2e9;
    int mid=l+r>>1;
    double ans=min(dfs(l,mid),dfs(mid+1,r));
    {
    // 不要问为什么加括号,问就是防止命名重复
    int i=l,j=mid+1,k=0;
    while(i<=mid&&j<=r){
        if(a[i].y>a[j].y){
            tmp[k++]=a[i++];
        }else{
            tmp[k++]=a[j++];
        }
    }
    while(i<=mid) tmp[k++]=a[i++];
    while(j<=r) tmp[k++]=a[j++];
    for(int i=0,j=l;i<k;i++,j++){
        a[j]=tmp[i];
    }
    }
    int k=0;
    for(int i=l;i<=r;i++){
        if(a[i].x<=a[mid].x+ans&&a[i].x>=a[mid].x-ans) tmp[k++]=a[i];
    }
    for(int i=0;i<k;i++){
        for(int j=i-1;j>=0&&tmp[i].y-tmp[j].y<ans;j--){
            ans=min(ans,dist(tmp[i],tmp[j]));
        }
    }
    return ans;
}
signed main(){
    int t;
    cin >> t;
    while(t--){
        int n;
        cin >> n;
        for(int i=0;i<n;i++){
            cin >> a[i].x >> a[i].y;
            a[i].vis=0;
        }
        for(int i=n;i<2*n;i++){
            cin >> a[i].x >> a[i].y;
            a[i].vis=1;
        }
        sort(a,a+2*n);
        printf("%.3lf\n",dfs(0,2*n-1));
    }
}

T3T3 数的进制转换

思路:f进制高精度除法模版题

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
    int t;
    cin >> t;
    while(t--){
        int x,y;
        string a,b;
        cin >> x >> y >> a;
        vector<int> x2,y2;
        for(int i=0;i<a.size();i++){
            if(a[i]>='0'&&a[i]<='9') x2.push_back(a[i]-'0');
            else if(a[i]>='A'&&a[i]<='Z') x2.push_back(a[i]-'A'+10);
            else x2.push_back(a[i]-'a'+36);
        }
        reverse(x2.begin(),x2.end());
        while(x2.size()){
            int r=0;
            // 高精除,但是非十进制
            for(int i=x2.size()-1;i>=0;i--){
                x2[i]+=r*x;
                r=x2[i]%y;
                x2[i]/=y;
            }
            y2.push_back(r);
            while(x2.back()==0&&x2.size()>0) x2.pop_back();
        }
        reverse(y2.begin(),y2.end());
        for(int i=0;i<y2.size();i++){
            if(y2[i]<=9) b+=char(y2[i]+'0');
            else if(y2[i]>=10&&y2[i]<=35) b+=char(y2[i]+'A'-10);
            else b+=char(y2[i]+'a'-36);
        }
        cout << x << " " << a << endl << y << " " << b << endl << endl;
    }
}

0 条评论

目前还没有评论...