【题解】ABC365(A~E)
前四题30min切,然后T5死磕70min+几发小唐错,距离比赛结束还有16s交最后一发,AC了。
A. Leap Year
题目描述
给你一个年份
思路
直接模拟即可。不能整除
代码
#include<bits/stdc++.h> using namespace std; #define il inline #define ri register #define inf 0x3f3f3f3f int a; int main() { scanf("%d",&a); if(a%4!=0||(a%100==0&&a%400!=0)) { puts("365"); } else { puts("366"); } return 0; }
B. Second Best
题目描述
给你一个长为
思路
数据范围很小,显然复杂度
代码
#include<bits/stdc++.h> using namespace std; #define il inline #define ri register int #define inf 0x3f3f3f3f int a,b; priority_queue<pair<int,int>>que; int main() { scanf("%d",&a); for(ri i=1;i<=a;i++) { scanf("%d",&b); que.push({b,i}); } que.pop(); printf("%d",que.top().second); return 0; }
C. Transportation Expenses
题目描述
有 炫富给他们进行交通补助 infinite
。
思路
首先有一个显然的结论:infinite
好了。
然后再想对于其他情况,显然,随着
代码
#include<bits/stdc++.h> using namespace std; #define il inline #define ri register long long #define inf 0x3f3f3f3f long long a,b,c[200002],sm,mx; il bool check(long long x) { ri rn=0; for(ri i=1;i<=a;i++) { rn+=min(c[i],x); if(rn>b) { return false; } } return true; } int main() { scanf("%lld%lld",&a,&b); for(ri i=1;i<=a;i++) { scanf("%lld",&c[i]); sm+=c[i]; mx=max(mx,c[i]); } if(sm<=b) { puts("infinite"); exit(0); } ri l,m=0,n=mx; while(n-m>1) { l=(m+n)>>1; if(check(l)) { m=l; } else { n=l; } } if(check(n)) { printf("%lld",n); } else { printf("%lld",m); } return 0; }
D. AtCoder Janken 3
题目描述
两人玩石头剪刀布,规定A一定不败给B,且A相邻的操作一定不相同。现在给你B的操作序列
思路
一眼dp题。设
代码
#include<bits/stdc++.h> using namespace std; #define il inline #define ri register long long #define inf 0x3f3f3f3f int a,b[200002],dp[200002][5],ans; char ch; int main() { scanf("%d",&a); for(ri i=1;i<=a;i++) { ch=getchar(); if(ch=='R') { b[i]=1; continue; } if(ch=='P') { b[i]=2; continue; } if(ch=='S') { b[i]=3; continue; } i--; } for(ri i=1;i<=a;i++) { if(b[i]==1) { dp[i][1]=max(dp[i-1][2],dp[i-1][3]); dp[i][2]=max(dp[i-1][1],dp[i-1][3])+1; continue; } if(b[i]==2) { dp[i][2]=max(dp[i-1][1],dp[i-1][3]); dp[i][3]=max(dp[i-1][1],dp[i-1][2])+1; continue; } if(b[i]==3) { dp[i][3]=max(dp[i-1][1],dp[i-1][2]); dp[i][1]=max(dp[i-1][2],dp[i-1][3])+1; continue; } } ans=max(dp[a][1],max(dp[a][2],dp[a][3])); printf("%d",ans); return 0; }
E. Xor Sigma Problem
题目描述
给你一个长为
思路
首先 发扬人类智慧考虑异或运算的实质,我们尝试把一个整数拆成二进制串,针对每一个新加进来的数,找前面每一位出现的0/1的个数。注意,这里我们找的个数是针对每个后缀的,因为只有连续的区间可以产生贡献。但是如果把它们分开存,时间上又回到了
代码
#include<bits/stdc++.h> using namespace std; #define il inline #define ri register long long #define inf 0x3f3f3f3f long long a,b[200002],pre[200002],num[200002][33][2],dp[33],ans; int main() { scanf("%lld",&a); for(ri i=0;i<=30;i++) { num[0][i][0]=1; } scanf("%lld",&b[1]); pre[1]=b[1]; for(ri j=0;j<=30;j++) { ri k=(pre[1]>>j)&1; num[1][j][k]=num[0][j][k]+1; num[1][j][k^1]=num[0][j][k^1]; } for(ri i=2;i<=a;i++) { scanf("%lld",&b[i]); pre[i]=pre[i-1]^b[i]; for(ri j=0;j<=30;j++) { ri k=(pre[i]>>j)&1; dp[j]+=num[i-2][j][k^1]; num[i][j][k]=num[i-1][j][k]+1; num[i][j][k^1]=num[i-1][j][k^1]; } for(ri i=0;i<=30;i++) { ans+=dp[i]*(1<<i); } printf("%lld",ans); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具