解题报告: Educational Codeforces Round 24 A,B,C
2017-07-01 11:26
603 查看
A、题目链接
题意:
n个人,有人有文凭,有人有证书,有的人什么也没有,其中有证书的人数量为有文凭的人的k倍,我们称有文凭或者有证书的人为有奖状的人,已知有奖的人不超过一半,询问最多有多少人获奖。
思路:
根据题意列个不等式直接算出结果即可。
代码:
B、题目链接
题意:
有一个只知道长度为n的全排列 首尾相连,当你在第i位时,你下一次会在往前走A[i] 的位置上,现在有人进行了m次操作,给你这m次的位置,询问能否还原出任意这样的全排列,若不能输出-1。
思路:
很明显若第i位在ai,第i+1为在a(i+1),那么就可以知道ai位置上的值A[i] ,这样如果有的格子没有走到,选没有1~n中没有填进去的数任意填就行,关键在如何判断无解的情况:
若走到之前已经走过的位置上,说明路线应该是一个环,那么如果后面的路线不在对应的环上,则无解。
代码很丑,踩了很多坑。。
C、题目链接
题意:
n,m<=1e6
n * m 的表格上 , 有 d 个物品,每个物品由相邻两个格子组成的,保证每个格子只属于一个物品。
如果格子a属于物品A,格子b属于物品B
xa<xb : A在B的左边
xa>xb : A在B的右边
ya<yb : A在B的上边
ya>yb : A在B的下边
注意一个物品可以同时在另一物品的上下或者左右。
现在已知你的物品上下左右各有多少个,询问是哪一个,保证最多只有一个,若没有输出-1。
思路:
维护四个方向的前缀和,然后O(d)的扫一遍,根据格子可能的两种形状分别O(1)的统计四个方向的物品数量即可
代码:
题意:
n个人,有人有文凭,有人有证书,有的人什么也没有,其中有证书的人数量为有文凭的人的k倍,我们称有文凭或者有证书的人为有奖状的人,已知有奖的人不超过一半,询问最多有多少人获奖。
思路:
根据题意列个不等式直接算出结果即可。
代码:
#include<bits/stdc++.h> using namespace std; int main() { long long n,k; while(scanf("%I64d%I64d",&n,&k)==2){ long long d = n/(2LL*k+2); if(d<0){ printf("0 0 0\n"); }else { printf("%I64d %I64d %I64d\n",d,d*k,n-d*(k+1)); } }return 0; }
B、题目链接
题意:
有一个只知道长度为n的全排列 首尾相连,当你在第i位时,你下一次会在往前走A[i] 的位置上,现在有人进行了m次操作,给你这m次的位置,询问能否还原出任意这样的全排列,若不能输出-1。
思路:
很明显若第i位在ai,第i+1为在a(i+1),那么就可以知道ai位置上的值A[i] ,这样如果有的格子没有走到,选没有1~n中没有填进去的数任意填就行,关键在如何判断无解的情况:
若走到之前已经走过的位置上,说明路线应该是一个环,那么如果后面的路线不在对应的环上,则无解。
代码很丑,踩了很多坑。。
#include<bits/stdc++.h> using namespace std; int n,m; bool used[105]; int A[105]; int ans[105]; int main() { while(scanf("%d%d",&n,&m)==2){ memset(used,0,sizeof(used)); memset(ans,-1,sizeof(ans)); bool ok = true; for(int i=0,t=0;i<m;i++){ scanf("%d",&A[i]); //printf("t-->%d\n",t); if(i){ if(t){ if(A[i]!=t){ ok = false; }else { t = A[i]+ans[A[i]]; if(t>n)t-=n; }continue; } int val = A[i]-A[i-1]; if(val<=0)val+=n; if(!used[val]){ used[val] = true; ans[A[i-1]] = val; }else { ok = false; }if(ans[A[i]]!=-1){ t = ans[A[i]] + A[i]; if(t>n)t-=n; } } }if(!ok){ printf("-1\n"); continue; }else { int t = 1; for(int i=1;i<=n;i++){ if(ans[i]==-1){ while(used[t])t++; used[t]=true; if(t>n){ printf("-1\n"); ok = false; break; } ans[i]=t; } }if(!ok)continue; for(int i=1;i<=n;i++){ printf("%d ",ans[i]); }printf("\n"); } }return 0; }
C、题目链接
题意:
n,m<=1e6
n * m 的表格上 , 有 d 个物品,每个物品由相邻两个格子组成的,保证每个格子只属于一个物品。
如果格子a属于物品A,格子b属于物品B
xa<xb : A在B的左边
xa>xb : A在B的右边
ya<yb : A在B的上边
ya>yb : A在B的下边
注意一个物品可以同时在另一物品的上下或者左右。
现在已知你的物品上下左右各有多少个,询问是哪一个,保证最多只有一个,若没有输出-1。
思路:
维护四个方向的前缀和,然后O(d)的扫一遍,根据格子可能的两种形状分别O(1)的统计四个方向的物品数量即可
代码:
#include<bits/stdc++.h> using namespace std; int n,m; int A[100005][4]; int fro[100005][4]; //L R T B int main() { int num; while(scanf("%d%d%d",&num,&n,&m)==3){ memset(fro,0,sizeof(fro));n++;m++; for(int i=1,a,b,x,y;i<=num;i++){ scanf("%d%d%d%d",&A[i][0],&A[i][2],&A[i][1],&A[i][3]); if(A[i][0]>A[i][1])swap(A[i][0],A[i][1]); if(A[i][2]>A[i][3])swap(A[i][2],A[i][3]); for(int j=0;j<4;j++)fro[A[i][j]][j]++; }for(int i=1;i<=n;i++)fro[i][0]+=fro[i-1][0]; for(int i=n-1;i>=0;i--)fro[i][1]+=fro[i+1][1]; for(int i=1;i<=m;i++)fro[i][2]+=fro[i-1][2]; for(int i=m-1;i>=0;i--)fro[i][3]+=fro[i+1][3]; int cntl,cntr,cntu,cntd; bool ok = false; scanf("%d%d%d%d",&cntl,&cntr,&cntu,&cntd); for(int i=1;i<=num;i++){ int l = A[i][0] , r = A[i][1] , u = A[i][2] , d = A[i][3]; int numl = fro[r-1][0] , numr = fro[l+1][1] , numu = fro[d-1][2] , numd = fro[u+1][3]; if(l==r){ numu--;numd--; }else { numl--;numr--; } if(numl==cntl&&numr==cntr&&numu==cntu&&numd==cntd){ printf("%d\n",i); ok = true; break; } }if(!ok){ printf("-1\n"); } }return 0; }
相关文章推荐
- 解题报告:Educational Codeforces Round 24 D,E,F
- 【解题报告】Educational Codeforces Round 12
- 【解题报告】Educational Codeforces Round 21
- [Updating] Educational Codeforces Round 20 解题报告
- Educational Codeforces Round 6 解题报告
- 【解题报告】Educational Codeforces Round 14
- 【解题报告】Educational Codeforces Round 16
- 【解题报告】Educational Codeforces Round 13
- 【解题报告】Educational Codeforces Round 20
- 【解题报告】Educational Codeforces Round 9
- 【解题报告】Educational Codeforces Round 15
- (中)Educational Codeforces Round 18 E题Colored Balls(简单的数学)解题报告
- ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) 解题报告
- 【解题报告】ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined)
- CodeforcesRound #322 (Div. 2) 解题报告
- Educational Codeforces Round 24 D. Multicolored Cars 补题
- Educational Codeforces Round 24 E. Card Game Again(双指针)
- Educational Codeforces Round 24 A
- codeforces Round #272(div2) C解题报告
- codeforces round 209 解题报告