A. Everyone Loves to Sleep
分析
24小时值,算出n个时间点与HM时间点的最短时间段。
将小时转换为分钟,算时间差,最后再转换为小时分钟。
代码
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=2e5+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
struct node {
int h,m;
int tmp;
}a[maxn];
int main()
{
guanliu;
int t;
cin>>t;
while(t--)
{
int n,H,M;
cin>>n>>H>>M;
int tmp=H*60+M;
int ans=INF;
for(int i=1;i<=n;i++)
{
cin>>a[i].h>>a[i].m;
a[i].tmp=a[i].h*60+a[i].m;
}
for(int i=1;i<=n;i++)
{
int res=a[i].tmp-tmp;
if(res<0) res+=24*60;
ans=min(res,ans);
}
cout<<ans/60<<" "<<ans%60<<endl;
}
return 0;
}
B. Remove Prefix
分析
n个数,可以从左向右删数使最后剩下数组的数字都不重复,求最少删几个数。
记录每个数出现的次数,从后向前遍历,出现重复停止,未被遍历到的数就是要删除的数。
代码
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=2e5+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn],vis[maxn];
int b[maxn];
int main()
{
guanliu;
int t;
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
memset(b,0,sizeof(b));
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
vis[a[i]]++;
}
int ans,cnt=0;
for(int i=n;i>0;i--)
{
if(b[a[i]]==1) break;
vis[a[i]]--;
cnt++;
b[a[i]]=1;
}
ans=n-cnt;
cout<<ans<<endl;
}
return 0;
}
C. Minimum Varied Number
分析
给一个数s,将分为不同数字组成的数,这个数各个位上的数字和为s,求最小的这个数。
因为要求数最小,所以越小位数越大,并且各个位数字不同,所以就从9开始依次遍历个位数,并用数组存储,最后倒叙输出。
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=2e5+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn];
int main()
{
guanliu;
int t;
cin>>t;
while(t--)
{
int b=9;
int s;
cin>>s;
int cnt=0;
while(s)
{
if(s>b)
{
a[++cnt]=b;
s-=b;
b--;
}
else {
a[++cnt]=s;
break;
}
}
for(int i=cnt;i>0;i--)
{
cout<<a[i];
}
cout<<endl;
}
return 0;
}
D. Color with Occurrences
分析
给一个t串和一些s串,如果s串是t的字串可以讲t串的对对应部分标红,如果可以将t串全部标红,求出最小操作次数,如果不可以输出-1。
数字较小,暴力解决。从前往后匹配t,每次选择能标红最多的s
在找题解的过程中,看到了dp解法,这题数据较小可以不用dp
代码
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=50;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
struct node {
int idx,pos;
};
vector<node> ans;
string s[maxn];
string t;
int lent,n,now;
int check()
{
int len=0,tmp=0,pos=0,idx=0;
string tmpt;
for(int i=1;i<=n;i++)
{
int lens=s[i].size();
tmp=0;
for(int j=max(0,now-lens);j+lens<=lent;j++)
{
if(j>now) break;
tmpt.erase(0,tmpt.size());
tmpt=t.substr(j,lens);
if(tmpt==s[i]) tmp=lens-(now-j);
if(tmp>len)
{
len=tmp;
idx=i;
pos=j+1;
}
}
}
if(len>0)
{
ans.pb({idx,pos});
now+=len;
return 1;
}
else return 0;
}
int main()
{
guanliu;
int q;
cin>>q;
while(q--)
{
ans.clear();
cin>>t;
cin>>n;
lent=t.size();
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
now=0;
int cnt=0;
while(now<lent)
{
cnt++;
if(cnt>100) break;
if(check()==0) break;
}
if(now>=lent)
{
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++)
{
cout<<ans[i].idx<<" "<<ans[i].pos<<endl;
}
}
else cout<<"-1"<<endl;
}
return 0;
}
E. Add Modulo 10
分析
一个数组,对于这个数组的每个数,都可以加上它对10求余的数,判断重复操作后,能否使数组中的数都相同。
找规律,发现除了0和5外,其余的数最后个位都会变成2,4,8,6的循环,这样一个周期就是20的长度,利用周期性,将数字化小,判断在一个周期内能否相同就可以了。
代码
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=2e5+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn],b[maxn];
int cnt[105];
void f(int x)
{
int res=x;
while(x<=40)
{
cnt[x]++;
x+=x%10;
}
}
int main()
{
guanliu;
int t;
cin>>t;
while(t--)
{
memset(cnt,0,sizeof(cnt));
int n;
cin>>n;
int ff=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]+=a[i]%10;
if(a[i]%10==5||a[i]%10==0) ff=1;
}
if(ff)
{
int fff=1;
int x=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]!=x)
{
fff=0;
break;
}
}
if(fff) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
continue;
}
for(int i=1;i<=n;i++)
{
a[i]=a[i]%20;
f(a[i]);
}
ff=0;
for(int i=1;i<=40;i++)
{
if(cnt[i]==n)
{
ff=1;
break;
}
}
if(ff) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}