A. 都化成分
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6,M=1e6+10;
int s[N];
void solve(){
int n,s,t;cin>>n>>s>>t;
int s1=s*60+t;int minn=INF;
while(n--){
int ss,tt;cin>>ss>>tt;
int s2=ss*60+tt;
if(s2<s1)s2+=1440;
int mid=abs(s2-s1);
minn=min(minn,mid);
}
cout<<minn/60<<" "<<minn%60<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
B. 反向遍历
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6,M=1e6+10;
int s[N];
void solve(){
int n;cin>>n;int a[n+1],vis[n+1],ans=0;
for(int i=1;i<=n;i++)cin>>a[i],vis[i]=0;
for(int i=n;i>=1;i--){
vis[a[i]]++;
if(vis[a[i]]==1)ans++;
else break;
}
cout<<n-ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
C. 栈
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6,M=1e6+10;
int s[N];
void solve(){
int n;cin>>n;stack<int> st;
int j=9;
while(n){
if(n>=j){
n-=j;st.push(j);
}
j--;
}
while(!st.empty()){
cout<<st.top();
st.pop();
}
cout<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
D. dp 或者 AC自动机 或者 最大区间覆盖
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6,M=1e6+10;
const int maxn=2e4+10;
int dp[maxn],ansl[maxn],ansid[maxn],nx[maxn];
char t[maxn],s[11][maxn];
void solve(){
int n;
scanf("%s",t+1);
cin>>n;
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
int m=strlen(t+1);
for(int i=1;i<=m;i++)
dp[i]=INF;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
int len=strlen(s[j]+1);
int k=0;
while(i-k>=1&&len-k>=1&&t[i-k]==s[j][len-k])
k++;
if(k!=len)
continue;
for(int q=i-1;i-len<=q;q--)
{
if(dp[i]>dp[q]+1)
{
dp[i]=dp[q]+1;
nx[i]=q;
ansid[i]=j;
ansl[i]=i-len+1;
}
}
}
}
if(dp[m]==INF)
cout<<-1<<'\n';
else
{
cout<<dp[m]<<'\n';
for(int i=m;i;i=nx[i])
cout<<ansid[i]<<' '<<ansl[i]<<'\n';
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}
E. 打标 发现最后都是2 4 8 6 循环而且 每个2 都是差20 我们只需要把他们都改成结尾是2 的情况 在看是否差值是20 的倍数即可 0不可在整改
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=1e6,M=1e6+10;
int s[N];
void solve(){
int n;cin>>n;int a[n+1],ok1=0,ok2=0,ok3=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
while(a[i]%10!=2&&a[i]%10!=0){
a[i]+=a[i]%10;
}
if(a[i]%10==2){
a[i]%=20;
}
}
for(int i=1;i<n;i++){
if(a[i]!=a[i+1])ok1=1;
}
if(ok1)cout<<"No"<<'\n';
else cout<<"Yes"<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
//int t=1;
while(t--){
solve();
}
}