RANK 0 题数 0
期末复习没有参加,补几道喜欢的题。
A: AFei Loves Magic 签到
思路 :不需考虑 碰撞 直接计算最终状态即可。
#include<bits/stdc++.h> using namespace std; #define maxn 12345 int ans,n,l,t,x,d; int main() { scanf("%d%d%d",&n,&l,&t); for(int i=1;i<=n;i++) { scanf("%d%d",&x,&d); if(d==1) if(x+t<l)ans++; if(d==2) if(x-t>0)ans++; } printf("%d ",ans+1); return 0; }
D: Dandan's lunch
叉积计算 三角形面积,没有给定点的顺序需要取绝对值。
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 123456 struct node { ll x[5],y[5],sum; bool operator<(const node &b)const { return sum>b.sum; } } a[maxn]; void cal(int id) { ll s1=0,s2=0; for(int i=1; i<=3; i++) { s1+=a[id].x[i]*a[id].y[i+1]; s2+=a[id].x[i+1]*a[id].y[i]; } a[id].sum=fabs(s1-s2); } ll n,rk,cp,one; int main() { rk=0; scanf("%lld",&n); for(int i=0; i<n; i++) { scanf("%lld",&cp); if(i==0)one=cp; else { if(cp>one)rk++; } for(int j=1; j<=3; j++) scanf("%lld%lld",&a[i].x[j],&a[i].y[j]); a[i].x[4]=a[i].x[1]; a[i].y[4]=a[i].y[1]; cal(i); } sort(a,a+n); printf("%lld ",a[rk].sum); return 0; }
F:Find the AFei Numbers
裸数位DP根据自己喜欢的方式定合理dp状态。
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 1324 ll t,n,dp[23][2][2][2]; int num[25],id; ll dfs(int cnt,bool is520,bool is52,bool is5,bool limit) { if(cnt==0)return is520?1:0; if(!limit&&dp[cnt][is520][is52][is5]!=-1) return dp[cnt][is520][is52][is5]; ll sum=0,up=(limit?num[cnt]:9); for(int i=0; i<=up; i++) { if(is520) sum+=dfs(cnt-1,1,0,0,(limit&&i==up)); else if(is52&&i==0) sum+=dfs(cnt-1,1,0,0,(limit&&i==up)); else if(is5&&i==2) sum+=dfs(cnt-1,0,1,0,(limit&&i==up)); else if(i==5) sum+=dfs(cnt-1,0,0,1,(limit&&i==up)); else sum+=dfs(cnt-1,0,0,0,(limit&&i==up)); } if(!limit)dp[cnt][is520][is52][is5]=sum; return sum; } ll solve() { id=0; while(n) { num[++id]=n%10; n/=10; } return dfs(id,0,0,0,1); } int main() { scanf("%lld",&t); while(t--) { memset(dp,-1,sizeof(dp)); scanf("%lld",&n); printf("%lld ",solve()); } return 0; }
L:The Digits String
思路 :dp[ n ] [ 4 ] 代表长度为 n时 取余4为0 的方案数 ,取余4为1的方案数 ,取余4为2的方案数 ,取余4为3的方案数。
根据每次数字增加一个长度 的种类 只有 10种 0 - 9 很容易写出递推方程 ,由于 n较大 ,矩阵快速幂加速即可。
#include<bits/stdc++.h> using namespace std; #define maxn 123456 #define ll long long #define mod 2019 struct node { ll a[10][10]; void up1() { for(int i=0; i<5; i++) for(int j=0; j<=5; j++) if(i==j)a[i][j]=1; else a[i][j]=0; } void up2() { for(int i=0; i<5; i++) for(int j=0; j<=5; j++) a[i][j]=0; } } mat,one,mtt; ll n,ans; node p(node xx,node yy) { node cc; cc.up2(); for(int k=1; k<=4; k++) for(int i=1; i<=4; i++) for(int j=1; j<=4; j++) cc.a[i][j]=(cc.a[i][j]+(xx.a[i][k]*yy.a[k][j])%mod)%mod; return cc; } node qpow(ll b) { node ret; ret.up1(); while(b) { if(b%2) ret=p(ret,mat); mat=p(mat,mat); b/=2; } return ret; } int main() { one.a[1][1]=3,one.a[2][1]=2,one.a[3][1]=2,one.a[4][1]=3; one.a[1][2]=3,one.a[2][2]=3,one.a[3][2]=2,one.a[4][2]=2; one.a[1][3]=2,one.a[2][3]=3,one.a[3][3]=3,one.a[4][3]=2; one.a[1][4]=2,one.a[2][4]=2,one.a[3][4]=3,one.a[4][4]=3; while(~scanf("%lld",&n)) { mat=one; mtt=qpow(n-1); ans=3*mtt.a[1][1]+3*mtt.a[2][1]+2*mtt.a[3][1]+2*mtt.a[4][1]; ans%=mod; printf("%lld ",ans); } return 0; }