A - Stickers and Toys
题目大意就是有n个鸡蛋,然后有s个彩带(吧?忘记了)和t个玩具,问至少要拿几次鸡蛋才有可能拿到一个彩带和一个鸡蛋。
就是可以分成三部分来算,就是a表示只有彩带的鸡蛋,b表示只有玩具的鸡蛋,c表示既有彩带又有玩具的鸡蛋。然后在a,b中取最大然后再+1就可以。
# include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,s,t;
int a=0,b=0,c=0;
int cnt=0;
scanf("%d %d %d",&n,&s,&t);
c=s+t-n;
a=s-c;
b=t-c;
cnt=max(a,b)+1;
printf("%d\n",cnt);
}
return 0;
}
B - Letters Shop
题目大意就是有一个字符串,然后有m个不完整子字符串,然后问这个不完整的子字符串,一共需要多少个才会完整(好吧╮(╯-╰)╭,感觉没有解释清楚)。
解法就是,计算当前子字符串中在原字符串的顺序中排最后一个的字母的次序。
先搞一个二维数组,然后把每个字母的次序记录下来。对于每一个子字符串来说,用一个数组表示每一个字母当前的次序,然后在二维数组里面寻找就可以。
# include <bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
int a[30][MAXN];
int mm[30];
int nn[30];
int main()
{
int n;
scanf("%d",&n);
string s;
cin>>s;
for(int i=0;i<n;i++){
a[s[i]-'a'][mm[s[i]-'a']++]=i+1;
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){
string s1;
cin>>s1;
memset(nn,0,sizeof(nn));
int maxx=0;
for(int j=0;j<s1.length();j++){
maxx=max(a[s1[j]-'a'][nn[s1[j]-'a']++],maxx);
}
printf("%d\n",maxx);
}
return 0;
}
C - Vasya And Array
【题意】就是要求找出一个序列的顺序是和要求的一样的序列即可
【解法】首先根据要求,把要求分成两部分,一部分是要求不降序的,一部分是不按不照降序的(不按照不降序就是不按照升序和平序,并不是说就是降序)(死活wa了好多次才明白介个)。首先满足不降序,就是用一个数组标记哪些区间是不不降序的,然后再满足不按照降序的,就是检查该区间是否都是平序和升序,最后再根据递推求出这个序列就可以了
# include <bits/stdc++.h>
using namespace std;
int a[1100];
int b[1100];
int t[1100];
int l[1100];
int r[1100];
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d %d %d",&t[i],&l[i],&r[i]);
if(t[i]==1){
for(int j=l[i];j<r[i];j++){
b[j]=1;
}
}
}
for(int i=1;i<=m;i++){
int flag=0;
if(t[i]==0){
for(int j=l[i];j<r[i];j++){
if(b[j]==0){
flag=1;
}
}
if(flag==0){
printf("NO");
return 0;
}
}
}
/* for(int k=1;k<n;k++){
printf("%d ",b[k]);
}
cout<<endl;
*/ a[1]=1100;
printf("YES\n");
printf("%d",a[1]);
for(int i=2;i<=n;i++){
if(b[i-1]){
a[i]=a[i-1]+b[i-1];
}else{
a[i]=a[i-1]-1;
}
printf(" %d",a[i]);
}
return 0;
}