A Diverse Substring
B Vasya and Books
C Birthday
D LCM
A 传送门
B 传送门
题解:
这道题,就比较简单了,直接用队列模拟一下就好了,话不多说,上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=2e5+; int n;
int a[maxn];
bool inStack[maxn];//inStack[i]:判断数i是否再栈中 int main()
{
scanf("%d",&n);
for(int i=;i <= n;++i)
scanf("%d",a+i);
mem(inStack,true);
int index=;
for(int i=;i <= n;++i)
{
int b;
scanf("%d",&b);
if(!inStack[b] || index > n)//如果b不在栈中
{
printf("0\n");
continue;
} int res=;
while(a[index] != b)
{
inStack[a[index++]]=false;
res++;
}
inStack[a[index++]]=false;
printf("%d\n",++res);
}
return ;
}
题目来源:CodeForces - 1073B
C 传送门
题解:
定义变量 tot 表示每个人拿 tot 个硬币
依据题意可得公式:
① : tot*M - K ≥ L
② : tot*M ≤ N
联利方程①②可得
(K+L)/M ≤ tot ≤ N/M
判断能否有满足条件的 tot
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll __int64 ll N,M,K,L; ll Solve()
{
ll a=(K+L)/M+((K+L)%M == ? :);
ll b=N/M;
if(a > b)
return -;
return a;
}
int main()
{
scanf("%I64d%I64d%I64d%I64d",&N,&M,&K,&L);
printf("%I64d\n",Solve());
return ;
}
题目来源:CodeForces - 1068A
D 传送门