题目链接:https://ac.nowcoder.com/acm/contest/54129
A
思路: 通过枚举记录下当前合法字符串数量,只要字符串中不同时存在‘1’,‘4’即为合法字符串,通过维护‘1’,‘4’的位置可以得到只有‘1’或只有‘4’或两个都不存在的字符串数量,比如“414”,枚举到第一个‘4’,数量唯一,到‘1’时有0-(-1)+1-0,(为下标,-1是先将‘1’‘4’下标初始化为-1)再到最后0-(-1)+1-0+2-1;
#include<bits/stdc++.h>
using namespace std;
char s[10000010];
int main(){
int n,p1=-1,p4=-1;
cin>>n;
getchar();
scanf("%s",s);
long long int sum=0;
for(int i=0;i<strlen(s);i++){
if(s[i]=='1')
p1=i;
else if(s[i]=='4')
p4=i;
sum+=i-min(p1,p4);//枚举当前合法字符串数量
}
cout<<sum;
}
B
思路:排序把贵的放在前面,他就只能买贵的而且不能多买
#include<bits/stdc++.h>
using namespace std;
int a[10000001];
bool cmp(int a,int b){
return a>b;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
printf("%d",a[i]);
if(i<n-1)
printf(" ");
}
printf("\n");
int t=m%n;
int t1=(m-t)/n;
for(int i=0;i<n-1;i++){
printf("%d ",t1);
}
printf("%d",t1+t);
}