浪在ACM 集训队第十次测试赛

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 传送门

  题解

04-20 23:15