解题报告:Codeforces Round #421 (Div. 2) A-E
来源:互联网 发布:网络奇葩歌词找歌 编辑:程序博客网 时间:2024/05/16 17:04
A、题目链接
题意:一本c页的书要读,你的初始读书速度为v0,每天速度增加a,速度上限为v1,每天读书后若书没有读完则忘记l页,询问多少天读完。
思路:
类似于蜗牛上树,数据小直接模拟,数据大推个公式。
代码:
#include<bits/stdc++.h>using namespace std;int c,v0,v1,a,l;int main(){ while(scanf("%d%d%d%d%d",&c,&v0,&v1,&a,&l)==5){ int ans = 0; while(c>=0){ ans++; c-=v0; v0 = min(v0+a,v1); if(c<=0)break; c+=l; }printf("%d\n",ans); }return 0;}
B、题目链接
题意
在正n多边形内选三个点组成一个角,求最靠近t的这个角的大小三个点号码
思路:
正n多边形内最大角为内角(n-2)*180/n,设角中心的点号码为1,那么最大角为213,每次想外移动一个单位,角度减小180/n,记录最靠近的答案就好,复杂度O(n)。
代码:
#include<bits/stdc++.h>using namespace std;int n;double a;int main(){ while(scanf("%d%lf",&n,&a)==2){ double mx = 1.0*(n-2)*180.0/n; double tmp = mx; int ans = n; double t = 180.0/n; for(int i=n-1;i>2;i--){ tmp-=t; if(fabs(tmp-a)<fabs(mx-a)){ ans = i; mx = tmp; } } printf("2 1 %d\n",ans); }return 0;}
C、题目链接
这个题有点问题,出题人的代码被hack了,详见 点击打开链接
题意:
两个人进行字符串游戏,初始串为空串,两个人轮流往后加字母,第一个人的操作是选择串里的后a个字母,然后往后面加a个字典序最小的与 选择的这个a个字母不重复的 不重复字母串,第二个可以任意加长度为b的字母串,给定l,r,问你作为第二个玩家进行游戏时组成的字符串[ l , r ]区间出现的字母种类数。
讲一下原来的思路:
第二个人只需要把串最后面的元素重复b次,然后就可以发现生成串是一个长度为2(a+b)的循环串,将区间映射到对应的循环串进行统计即可。
D、题目链接
题意:
给定一个长度为n的全排列,定义 deviation为每个位上的数减去下标的绝对值之和,你可以进行把最右边的数放在最左的操作,问你可以通过这个操作得到的最小的deviation和得到这个deviation进行的操作个数。
思路:
先计算得出初始串的deviation 值,并统计 数字和下标相等的个数numa ,数字比下标小的个数numb , 数字比下标大的个数numc,big[x]数组记录数字比下标大x的个数。每次操作,不考虑最后一位的变化,原本小的贡献会变得大,等于的贡献会变大,大的贡献会变小,利用numa,numb,numc,还有分类讨论最后位数与下标的大小的情况可以O(1)的更新deviation,统计最小值即可。
代码:
#include<bits/stdc++.h>using namespace std;int n;int A[1000005];int big[1000005];int main(){ int a=0,b=0,c=0; long long ans = 0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&A[i]); ans += abs(A[i]-i); if(A[i]>i){ c++; big[A[i]-i]++; }else if(A[i]==i){ a++; big[0]++; }else { b++; } }//printf("ans-->%d\n",ans); int pos = n , id = 0; int ans_pos = 0 ; long long tmp = ans; while(--pos){ id++; tmp += b+a; tmp -= c; b = b+a; c = c-big[id]; a = big[id]; if(A[pos+1]==n){ tmp += n-2; int t = id + n-1; if(t<=n)big[t]++; b--; c++; }else if(A[pos+1]==1){ b--; a++; tmp -= n; }else { b--; c++; int t = id+A[pos+1]-1; if(t<=n)big[t]++; tmp += -abs(A[pos+1]-n-1)+(A[pos+1]-1); } //printf("%d %d a->%d b->%d c->%d\n",id,tmp,a,b,c); if(tmp<=ans){ ans = tmp; ans_pos = id; } }printf("%I64d %d\n",ans,ans_pos); return 0;}
E、题目链接
题意:
有三个装置,装置A放在(m,0)处,装置B放在(0,n)处,装置C不明。
第一步把装置A直线移动到原点,第二步把装置B直线移动到原点,当三个装置都位于整数点上且他们之间的三角形面积为s时会发出一次信号,问移动过程中有多少个位置可能会发出信号。
m,n,s都是以3个整数ma*mb*mc=m的形式给出,1000组数据一个文件。
思路:
考虑第一步操作的过程,设A(k,0),B(0,n),C(x,y),则利用叉积求得三角形面积为k*(y-n)+x*n,只需要判断这个式子能否等于2s,很明显该式子有整数解只需要满足gcd(k,n)|2s,那么我们只需要求满足gcd(k,n)|2s的k个数即可,设n和2s的唯一分解式为n=PI(pi^ni) , 2s = PI(pi^si) ,我们知道当相同pi时,若ni>si,则pi^(si+1)不能整除k,利用这点加上容斥可以求得第一步里可能的位置个数。
考虑第二步操作的过程,设A(0,0),B(0,k),C(x,y),则三角形面积为k*x,那么只有求得满足 k|2s 的k的个数即可,dfs一下即可。
代码:
#include<bits/stdc++.h>#define pii pair<long long,int>#define fi first#define se secondusing namespace std;vector<pii>V;map<int,int>M[4];long long n , m , s , ans;void oper(int x,int k){ for(int i=2,ed=sqrt(x+0.5);i<=ed&&x>1;i++){ while(x%i==0){ x/=i; M[k][i]++; } }if(x>1)M[k][x]++;}void dfs1(int pos,int need,int k,long long val,const long long& x){ if(!need||val>x){ ans += k * x/val; return ; }for(int i=pos;i<V.size();i++){ if(val*V[i].fi/V[i].fi==val) dfs1(i+1,need-1,k,val*V[i].fi,x); }}void dfs2(int pos , long long val ,const long long& mx){ if(val<=mx){ ans++; }else { return ; } for(int i=pos;i<V.size();i++){ long long t = val; for(int j=1;j<=V[i].se;j++){ t *= V[i].fi; dfs2(i+1,t,mx); } }}long long qpow(long long x,int y){ long long res = 1; while(y){ if(y&1)res *= x; y>>=1; x *= x; }return res;}int main(){ int T; scanf("%d",&T); while(T--){ V.clear(); for(int i=0;i<3;i++)M[i].clear(); n = 1 , m = 1 , s = 2; M[2][2]++; for(int i=0,x;i<3;i++){ scanf("%d",&x); n *= x; oper(x,0); }for(int i=1,x;i<=3;i++){ scanf("%d",&x); m *= x; oper(x,1); }for(int i=1,x;i<=3;i++){ scanf("%d",&x); s *= x; oper(x,2); } M[3].clear(); V.clear(); for(auto it = M[0].begin();it!=M[0].end();it++){ if( it->se > M[2][it->fi]){ V.emplace_back(pii(qpow(it->fi,M[2][it->fi]+1),0)); } }ans = m; for(int i=1;i<=V.size();i++){ dfs1(0,i,(i&1)?-1:1,1,m); }//printf("ans-->%I64d\n",ans); V.clear(); for(auto it=M[2].begin();it!=M[2].end();it++){ if(it->se){ V.emplace_back(*it); } }dfs2(0,1,n); printf("%I64d\n",ans); }return 0;}
- 解题报告:Codeforces Round #421 (Div. 2) A-E
- 解题报告:Codeforces Round #364 (Div. 2) A~E
- 解题报告:Codeforces Round #371 (Div. 2) A~E
- Codeforces Round #279 (Div. 2) 解题报告 A.B.C.D.E
- Codeforces Round #280 (Div. 2) 解题报告(A B C D E)
- Codeforces Round #280 (Div. 2) 解题报告 A.B.C.D.E.
- Codeforces Round #287 (Div. 2) 解题报告 A.B.C.D.E
- Codeforces Round #289 Div. 2 解题报告 A.B.C.E
- Codeforces Round #291 (Div. 2)解题报告A.B.C.D.E
- Codeforces Round #283(Div.2) A,B,C,D,E 解题报告
- 解题报告:Codeforces Round #424 (Div. 2) A B C D E F
- 解题报告:Codeforces Round #432 (Div. 2) E.Arpa and a game with Mojtaba (博弈)
- Codeforces Round #188 (Div. 2) 解题报告 //缺E
- Codeforces Round #192 (Div. 2) 解题报告 //缺E
- Codeforces Round #274 (Div. 2) 解题报告 (C D E)
- Codeforces Round #306 (Div. 2) D.E. 解题报告
- Codeforces Round #225 (Div. 2)A:Coder 解题报告
- Codeforces Round #283 (Div. 2) 解题报告(A B C)
- opencv安装
- git 的一些命令
- TypeScript 学习笔记3: ECMAScript 2015 的新特性
- Ubuntu安装jdk
- 1.4 最长回文子串
- 解题报告:Codeforces Round #421 (Div. 2) A-E
- NIO 入门
- uCOS-II中的任务切换机制
- python自然语言处理 第二章(上)
- FFMpeg无损合并视频的多种方法
- pagehelper 插件应用报错:ConversionNotSupportedException: Failed to convert property value of type ‘java.la
- html的属性操作01
- 《奥威Power-BI自定义计算的奥妙---工艺线产品合格率分析》精彩回顾
- 实用的网络模型