AtCoder Beginner Contest 182 A-E
A:签到题。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #include <queue> 6 #include <map> 7 #include <string> 8 using namespace std; 9 int a,b; 10 int main(void) 11 { 12 scanf("%d %d",&a,&b); 13 printf("%d\n",2*a+100-b); 14 return 0; 15 }
B:输出数列中出现次数最多的大于1的因子。不是所有数的公因子,只要出现次数最多即可。那我们不妨对每个数做质因数分解,标记一下,最后找出现最多的即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <queue> 7 #include <map> 8 #include <string> 9 using namespace std; 10 int n,x,ans=1,cnt; 11 map<int,int>mp; 12 void dic(int x) 13 { 14 for(int i=2;i*i<=x;++i) 15 { 16 if(x%i==0) 17 { 18 mp[i]++; 19 while(x%i==0)x/=i; 20 } 21 } 22 if(x!=1)mp[x]++; 23 } 24 int main(void) 25 { 26 cin>>n; 27 for(int i=1;i<=n;++i) 28 { 29 cin>>x; 30 dic(x); 31 } 32 for(auto it=mp.begin();it!=mp.end();++it) 33 { 34 if(it->second>cnt) 35 { 36 cnt=it->second; 37 ans=it->first; 38 } 39 } 40 cout<<ans<<endl; 41 return 0; 42 }
C:删除某些位上的数字,使得该数为3的倍数。求最小删除数量,若不可能输出-1。我们知道某个数是3的倍数,那它所有位上的数字之和应为3的倍数。先求出所有位的数字之和,再对3求余。若刚好为0,则不用删除。若为1,检查是否有1个模3余1的位或者2个模3余2的位,若有则删除这些数字。若为2,检查是否有2个模3余1的位或者1个模3余2的位,若有则删除这些数字。若删除数量正好等于数的长度,输出-1。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <map> #include <string> using namespace std; long long n; int a[3],sum,cnt; int main(void) { cin>>n; while(n) { sum+=n%10; a[n%10%3]++; n/=10; cnt++; } int ans=0; sum%=3; if(sum!=0) { if(sum==1) { if(a[1]>0)ans=1; else if(a[2]>1)ans=2; } else { if(a[2]>0)ans=1; else if(a[1]>1)ans=2; } } if(cnt==ans)ans=-1; cout<<ans<<endl; return 0; }
D:一个机器人开始在坐标为0的位置,先沿正方向走A1步,然后沿正方向走A1、A2步,一直到最后沿正方向走A1、A2、……、An步,求该过程中走到的最远坐标。求前缀和的同时维护一个最大前缀和,说明在第i次移动中当前位置加上最大前缀和就是能到达的最远距离,每次走完更新答案。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <map> #include <string> using namespace std; long long n; long long a[210000],b[210000]; int main(void) { scanf("%lld",&n); long long m=0; for(int i=1;i<=n;++i) { scanf("%lld",&a[i]); a[i]+=a[i-1]; m=max(m,a[i]); b[i]=m; } long long ans=0,now=0; for(int i=1;i<=n;++i) { ans=max(ans,now+b[i]); now+=a[i]; } printf("%lld\n",ans); return 0; }
E:有n个灯,可以向上下左右四个方向射出光线,直到遇到砖块。求所有非砖块的格子中可以被光照到(包括灯)的格子数量。我们直接对每个灯进行模拟,向四个方向遍历,直到遇到砖块或者灯就停下。(亲测遇到灯不停下会超时,虽然算了一下复杂度应该是能卡过的(口胡))
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <queue> 7 #include <map> 8 #include <string> 9 using namespace std; 10 int l[1500][1500]; 11 int a[500000],b[500000]; 12 int h,w,n,m,ans; 13 int main(void) 14 { 15 scanf("%d %d %d %d",&h,&w,&n,&m); 16 ans=n; 17 for(int i=0;i<n;++i) 18 { 19 scanf("%d %d",&a[i],&b[i]); 20 --a[i];--b[i]; 21 l[a[i]][b[i]]=2; 22 } 23 for(int i=0;i<m;++i) 24 { 25 int x,y; 26 scanf("%d %d",&x,&y); 27 --x;--y; 28 l[x][y]=-1; 29 } 30 for(int i=0;i<n;++i) 31 { 32 int x=a[i],y=b[i]; 33 for(int j=x+1;j<h;j++) 34 { 35 if(l[j][y]==-1||l[j][y]==2)break; 36 l[j][y]=1; 37 } 38 for(int j=x-1;j>=0;j--) 39 { 40 if(l[j][y]==-1||l[j][y]==2)break; 41 l[j][y]=1; 42 } 43 for(int j=y+1;j<w;++j) 44 { 45 if(l[x][j]==-1||l[x][j]==2)break; 46 l[x][j]=1; 47 } 48 for(int j=y-1;j>=0;--j) 49 { 50 if(l[x][j]==-1||l[x][j]==2)break; 51 l[x][j]=1; 52 } 53 } 54 for(int i=0;i<h;++i) 55 { 56 for(int j=0;j<w;++j) 57 { 58 if(l[i][j]==1)ans++; 59 } 60 } 61 printf("%d\n",ans); 62 return 0; 63 }
F:咕咕咕
终究独木难支。