随笔 - 72,  文章 - 2,  评论 - 0,  阅读 - 1258

A. Digits Are Not Just Characters

题意:给一个串s,然后给n个串si,问si与s相比,哪个更大,与字典序不同,假设s为aabb134,字母的大小相比一样,但数字不同,数字是看他转为10进制的大小,aabb98小于s

思路:相同则跳过,不同,若是字母,直接判断,若是数字,则把数字的位数找到,位数相同则判断,位数大的更大,假设开头就是数字,直接判断

diamond:

#include "bits/stdc++.h"
#define int long long

using namespace std;

const int N = 5010;
int dp[N][N];
string s;
int  checkshuzi(char f){
    if(f>='0'&&f<='9'){
        return 1;
    }
    return 0;
}
void solve(){
    string s2;
    cin>>s2;
    for (int i = 0; i <min(s2.size(),s.size()) ; ++i) {
        if(s[i]==s2[i]&& checkshuzi(s[i])==0){
            continue;
        }
        int st1= checkshuzi(s[i]);
        int st2= checkshuzi(s2[i]);
//        cout<<st1<<' '<<st2<<endl;
        if(st1!=st2){
            if(s[i]>s2[i]){
                cout<<"-\n";
                return;
            }
            if(s[i]<s2[i]){
                cout<<"+\n";
                return;
            }
        }
        if(st1==0){
            if(s[i]>s2[i]){
                cout<<"-\n";
                return;
            }
            if(s[i]<s2[i]){
                cout<<"+\n";
                return;
            }
        }
        if(st1==1){
            int ans1=0,ans2=0;
            for (int j = i; j <s.size() ; ++j) {
                if(checkshuzi(s[j])==0) {
                    break;
                }
                ans1=j;
            }
            for (int j = i; j <s2.size() ; ++j) {
                if(checkshuzi(s2[j])==0) {
                    break;
                }
                ans2=j;
            }
            if(ans1<ans2){
                cout<<"+\n";
                return;
            }
            else if (ans2<ans1){
                cout<<"-\n";
                return;
            }
            else{
                if(s[i]>s2[i]){
                    cout<<"-\n";
                    return;
                }
                if(s[i]<s2[i]){
                    cout<<"+\n";
                    return;
                }
            }
        }
    }
    if(s.size()<=s2.size())
    cout<<"+\n";
    else{
        cout<<"-\n";
    }

}

signed main() {
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int n;
    cin>>n;
    cin>>s;
    while (n--){
        solve();
    }

}

B.Arithmetic Progressions

思路: 我们设dp[i][j]为以j为结尾,以i为倒数第二个数结尾的合法序列的长度,那么我们设dp[i][j]为2,所有初始化为2.我们枚举i,j,然后二分下一个满足序列的数字,f[i][j]=max(f[i][j],f[j][pos]+1),取max

diamond:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=5e3+10;
int n,a[N],dp[N][N],res;
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++)   cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=2;i<=n;i++){
        for(int j=1;j<i;j++){
            int pos=lower_bound(a+1,a+1+n,2*a[j]-a[i])-a;
            if(a[pos]+a[i]==2*a[j]) dp[i][j]=max(dp[i][j],dp[j][pos]+1);
            res=max(res,dp[i][j]);
        }
    }
    cout<<res+2;
    return 0;
}

C. Emergency Evacuation

题意:r行2 * s列的车厢,出口在正下方,一共p个人,坐标为xi,yi,问最少多少秒可以全部离开,若两人相撞,必有一人停一秒

思路:根据据终点的距离排序,维护一下下一个人最早能出去的时间x,如果a[i]<=x,那么x++,否则 ans=a[i]+1,最后求max(x,a[n])

diamond:

#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
    vector<int>q;
    int a,b,n;
    cin>>a>>b>>n;
    pair<int, int> point = {a, b + 1};

    for (int i = 0; i <n ; ++i) {
        int x,y;
        cin>>x >> y;
        if (y > b) y++;

        q.push_back(abs(x - point.first) + abs(y - point.second)+1);
    }
    int ans=0;
//    q[4]=q[5]=5;
//    q.clear();
//    q.push_back(500);
//    q.push_back(3);
//    q.push_back(3);
    sort(q.begin(),q.end());
////    q.push_back(8);
//    for (auto i :q) {
//        cout<<i<<' ';
//    }
//    cout<<endl;
    int res=0;
    for (int i = 0; i <q.size()-1 ; ++i) {
//        cout<<ans<<' ';
        if(q[i]<=ans){
            ans++;
        }
        else{
            ans=q[i]+1;
        }
    }
    ans=max(ans,q.back());
    cout<<ans<<endl;
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int t=1;
    while (t--){
        solve();
    }
}
/*
 * 5 2 7
 * 1 1
 * 1 2
 * 1 3
 * 2 3
 * 2 4
 * 4 4
 * 5 2
 */

/*
 * 500 500 16
 * 1 1
 * 1 2
 * 1 999
 * 1 1000
 * 2 1
 * 2 2
 * 2 999
 * 2 1000
 * 3 1
 * 3 2
 * 3 999
 * 3 1000
 * 499 500
 * 499 501
 * 499 999
 * 499 1000
 *
 */

G.What Goes Up Must Come Down

题意:给一个长度为n的数组,我们要通过一个操作,把这个数组变为峰形,先不减后不增,操作就是交换相邻的两数

思路:我们求每个数作为峰左边,和峰右边的代价是多少,取最小即可,作为左边的代价即是,他左边作为逆序对的个数,右边的代价是他右边作为顺序对的个数,我们用树状数组求即可,L从左往右求,R从右边往左求

diamond:

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
int mod;
int n,p;
const int N=1e5+5;
int a[N],tr[N];
int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int v)
{
    for(int i=x;i<N;i+=lowbit(i))tr[i]+=v;
}
int query(int x)
{
    int res=0;
    for(int i=x;i;i-=lowbit(i))res+=tr[i];
    return res;
}
int pre[N],ure[N];
void solve() {
    cin>>n;
    for (int i = 1; i <=n ; ++i) {
        cin>>a[i];
        int r= query(N-1);
        int l= query(a[i]);
//        cout<<r<<' '<<l<<endl;
        pre[i]=r-l;
        add(a[i],1);
    }
    ::memset(tr,0,sizeof tr);
    for (int i = n; i >=1 ; --i) {
        int r=query(N-1);
        int l=query(a[i]);
        ure[i]=r-l;
        add(a[i],1);
    }
    int ans=0;
    for (int i = 1; i <=n ; ++i) {
//        cout<<pre[i]<<' '<<ure[i]<<endl;
        ans+=min(pre[i],ure[i]);
    }
    cout<<ans<<endl;
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int t=1;
//    cin>>t;//
    while (t--){
        solve();
    }
}
posted on   IR101  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示