2018.12.21 浪在ACM 集训队第十次测试赛
A Diverse Substring
B Vasya and Books
C Birthday
D LCM
A 传送门
B 传送门
题解:
这道题,就比较简单了,直接用队列模拟一下就好了,话不多说,上代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define mem(a,b) memset(a,b,sizeof(a)) 6 const int maxn=2e5+10; 7 8 int n; 9 int a[maxn]; 10 bool inStack[maxn];//inStack[i]:判断数i是否再栈中 11 12 int main() 13 { 14 scanf("%d",&n); 15 for(int i=1;i <= n;++i) 16 scanf("%d",a+i); 17 mem(inStack,true); 18 int index=1; 19 for(int i=1;i <= n;++i) 20 { 21 int b; 22 scanf("%d",&b); 23 if(!inStack[b] || index > n)//如果b不在栈中 24 { 25 printf("0\n"); 26 continue; 27 } 28 29 int res=0; 30 while(a[index] != b) 31 { 32 inStack[a[index++]]=false; 33 res++; 34 } 35 inStack[a[index++]]=false; 36 printf("%d\n",++res); 37 } 38 return 0; 39 }
题目来源:CodeForces - 1073B
C 传送门
题解:
定义变量 tot 表示每个人拿 tot 个硬币 依据题意可得公式: ① : tot*M - K ≥ L ② : tot*M ≤ N 联利方程①②可得 (K+L)/M ≤ tot ≤ N/M 判断能否有满足条件的 tot
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define ll __int64 6 7 ll N,M,K,L; 8 9 ll Solve() 10 { 11 ll a=(K+L)/M+((K+L)%M == 0 ? 0:1); 12 ll b=N/M; 13 if(a > b) 14 return -1; 15 return a; 16 } 17 int main() 18 { 19 scanf("%I64d%I64d%I64d%I64d",&N,&M,&K,&L); 20 printf("%I64d\n",Solve()); 21 return 0; 22 }
题目来源:CodeForces - 1068A
D 传送门