A. Another One Bites The Dust
题意:有三种字符的若干数目,求使得这些字符拼接起来前后字符不一样的最长字符长度。
思路:首先a,b,c可以拼接成长度为4的字符,然后再接c可以拼接长度为2的字符,最后再判断a和b还有没有剩余。
#include
using namespace std;
int main(){
int a,b,c;
long long ans=0;
scanf("%d%d%d",&a,&b,&c);
int t=min(a,min(b,c));
ans=(long long)4*t;
a-=t;
b-=t;
c-=t;
ans+=(long long)2*c;
t=min(a,b);
ans+=(long long)2*t;
a-=t;
b-=t;
if(a!=0)
ans++;
if(b!=0)
ans++;
printf("%lld\n",ans);
}
B. Born This Way
题意:乘客可以在a序列的任意时刻上车,花费ta时间到达b车站,再花费tb时间到达c,你可以取消最多k个时刻,问他最迟什么时候到c站。
思路:暴力加二分。
#include
using namespace std;
int main(){
int n,m,ta,tb,k;
scanf("%d%d%d%d%d",&n,&m,&ta,&tb,&k);
for(int i=0;i=n||k>=m)
puts("-1");
else{
long long ans=-1;
long long t;
for(int i=0;i<=k;i++){
t=(long long)(a[i]+ta);
int p1=lower_bound(b,b+m,t)-b;
if((long long)(p1+k-i)
C. Crazy Diamond
题意:给定数组,如果两个数下标满足2*|i-j|>=n,那么这两个数能交换,问最终使得数组有序操作。
思路:用一个数组保存每个数的下标,从1到n遍历一遍,如果符合要求就换,否则利用1和n来换。
#include
using namespace std;
int a[300005],b[300005];
typedef pairp;
vectorv;
void change(int x,int y){
b[a[x]]=y;
b[a[y]]=x;
v.push_back(p(x,y));
swap(a[x],a[y]);
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),b[a[i]]=i;
int ans=0;
for(int i=1;i=n){
ans++;
change(i,b[i]);
}
else{
if(2*(b[i]-1)>=n){
if(2*(i-1)>=n){
ans+=3;
int x=b[i];
change(1,b[i]);
change(1,i);
change(1,x);
}
else{
ans+=4;
int x=b[i];
change(1,b[i]);
change(1,n);
change(i,n);
change(1,x);
}
}
else{
ans+=2;
change(b[i],n);
change(i,n);
}
}
}
printf("%d\n",ans);
for(int i=0;i
D. Dirty Deeds Done Dirt Cheap
题意:给定n个a和b的元组,问怎样最多选择他们的顺序符合要求。
思路:两次排序就可以了。
#include
using namespace std;
struct node{
int c,id;
};
node a[300005],b[300005];
int cmp1(node a,node b){
return a.cb.c;
}
int main(){
int n;
scanf("%d",&n);
int t1=0,t2=0,x,y;
for(int i=1;i<=n;i++){
scanf("%d%d",&x,&y);
if(xt2){
printf("%d\n",t1);
for(int i=0;i