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
思路: 我们设 为以j为结尾,以i为倒数第二个数结尾的合法序列的长度,那么我们设 为2,所有初始化为2.我们枚举 ,然后二分下一个满足序列的数字, ,取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,如果 ,那么x++,否则 ,最后求
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();
}
}
分类:
SMU夏季补题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】