1257A - Two Rival Students
有一对素质同桌处于 a,b 两个位置,每一次他们都可以向右或向左移动 1 位,有 k 次机会,问最多可以多远
int main()
{
rush(){
int a,b;
cin>>n>>k>>a>>b;
if(a>b) swap(a,b);
int dis=b-a;
int res=n-(dis+1);
int ans;
if(k>=res) ans=n-1;
else ans=dis+k;
cout<<ans<<endl;
}
//PAUSE;
return 0;
}
B - Magic Stick
有两个数 x , y 如果 x 是偶数则可以 x/2*3 的操作,若 x >1 其可以自减一,判断 x 能否变为 y
只有 1 2 3 不可以变得越来越大,特判也可以
int main()
{
rush(){
ll x,y;
cin>>x>>y;
if(y<=x) { puts("yes"); continue; }
bool flag=0;
while(y>x){
int tmp=x;
if(tmp&1) tmp--;
tmp=tmp/2*3;
if(tmp>x) x=tmp;
else{ flag=1; break; }
}
puts(flag?"no":"yes");
}
//PAUSE;
return 0;
}
C - Dominated Subarray
这个一开始读错题了,但发现这个题之前做过……
原文链接
从n个数中找出一个字串,使得这个字串只有1个重复元素且重复次数为二,输出最短长度
const int N=2e5+5;
int n,m,t;
int i,j,k;
int a[N];
map<int,int>mp;//记录上一次 a[i] 出现的位置
int main()
{
IOS; string s;
rush(){
int ans=inf;
cin>>n; mp.clear();
for(i=0;i<n;i++){
cin>>a[i];
}
if(n==1){cout<<-1<<endl; continue;}
for(i=0;i<n;i++){
if(!mp.count(a[i]))
mp[a[i]]=i;
else {
ans=min(ans,i-mp[a[i]]+1);
mp[a[i]]=i;
}
}
if(ans==inf) cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}
------------------------------------------------------------------------思维分界线--------------------------------------------------------------------------
D - Yet Another Monster Killing Problem(贪心+思维)
有n个怪兽 ,每个怪兽都有暴力值为 a[i]。
而幸好现在有m个英雄,每个英雄也有暴力值 p[i],此外英雄还有抗揍值 s[i],表示这个英雄一天最多打败 s[i] 个怪兽
我们只能消灭怪兽(one by one),不能改变顺序,输出最少多少天打败所有的怪兽。
这个题数组 s[i] 的范围为 [1,n] ,所以我们可以开一个数组 b[i] 代表抗揍值为 i 的英雄的最大暴力值,当然这些拥有最大暴力值英雄也可以压迫 [1,i] 只怪兽
因为英雄可以不按顺序出,所以只要满足抗揍区间 b[L,R]>a[i] ( L<=i<=R )
const int N=2e5+5;
int n,m;
double t;
int i,j,k;
int a[N],b[N];
int p[N],s[N];
int main()
{
rush(){
sd(n);
for(i=1;i<=n;i++) b[i]=0,sd(a[i]);
sd(m);
for(i=1;i<=m;i++) sdd(p[i],s[i]),b[s[i]]=max(b[s[i]],p[i]);
//cout<<*(a.begin()+2)<<endl;
if( *max_element(a+1,a+1+n) > *max_element(p+1,p+1+m) ){ puts("-1"); continue; }
for(i=n-1;i>=1;i--){//坚持的天数
b[i]=max(b[i],b[i+1]);
}
int ans=0,cur=1;//耐力值的起点
while(cur<=n){//寻找怪兽
int tmp=cur;//耐力值的终点
int maxx=0;
while(true){
maxx=max(maxx,a[tmp]);
if(maxx>b[tmp-cur+1]) break;
tmp++;
}
ans++;
cur=tmp;
}
pd(ans);
}
//PAUSE;
return 0;
}
E - The Contest
a 数组有 k1 个数,b 数组有 k2 个数,c 数组有 k3 个数,每个数组都可以将自己的元素交出去,问最少要多少次使得 C>B>A(数组C内所有元素都大于另外的数组,数组 B 内所有元素都大于 A 的,当然数组可以为空)
思路:先将原数组进行编号 A(1),B(2),C(3) ,保证 ABC 单调递增如果出现极值点,将极点归还给对应数组即可,例如入样例 13123 的情况下,因为将二号元素移动到数组 A 中,所以变为 11123
const int N=2e5+5;
int n,m;
double t;
int i,j,k;
int a[N],b[N];
int main()
{
int k1,k2,k3,_;
sddd(k1,k2,k3);
for(i=1;i<=k1;i++){
sd(_);
a[_]=1;
}
for(i=1;i<=k2;i++){
sd(_);
a[_]=2;
}
for(i=1;i<=k3;i++){
sd(_);
a[_]=3;
}
int res=0;
n=k1+k2+k3;
for(i=1;i<=n;i++){
if(res==0 || a[i]>=b[res-1]) b[res++]=a[i];
else{
int pos=upper_bound(b,b+res,a[i])-b;
b[pos]=a[i];
}
}
pd(n-res);
return 0;
}