蒟蒻打校賽#1
阿新 • • 發佈:2020-12-08
技術標籤:演算法
蒟蒻菜了,被隊佬吊打
A.三角形
略
B. 求gcd
略
C.a*b
略
D.isprime
大於3的prime必滿足6n+1 or 6n-1 ,從2到判斷的 那個數的平方根 逐個判斷能否整除那個數。
E.高精度
打不來,逃
ctrl v了大佬的AC碼
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int ans,t,pos,n[1005],p[1005]; char N[1005]; int main(){ scanf("%d\n",&t); while(t--){ for(int i=0;i<=1000;i++)N[i]='*'; scanf("%s",N); int len=0; while(N[len]>='0'&&N[len]<='9')len++; for(int i=0;i<len;i++) n[i]=N[len-i-1]-'0'; for(int i=0;i<=1005;i++) p[i]=-1; p[0]=1,ans=1,pos=1; while(pos){ for(int i=len-1;i>=0;i--){ if(n[i]>p[i])break; if(n[i]<p[i]){ pos=0; break; } } if(!pos)break; ans++; int no_=0; while(p[no_]>=0){ p[no_]*=2; no_++; } no_=0; while(p[no_]>=0){ if(p[no_+1]<0&&p[no_]>=10)p[no_+1]=0; p[no_+1]+=(p[no_]/10); p[no_]%=10; no_++; } if(no_>len)break; } printf("%d\n",ans-1); } return 0; }
F. easy dp
狀態轉移方程 f[i]=max(f[i-j]-(h[i]-h[i-j]),f[i])(1<=j<=l)
i<l時先處理一下f[i]
#include<bits/stdc++.h> using namespace std; int h[100100]; int spent(int x,int y) { if(h[x]>h[y]) return h[x]-h[y]; else return 0; } int main() { int t; int f[100100]; int n,m,l; scanf("%d",&t); while(t--) { memset(h,0,sizeof(h)); memset(f,-1,sizeof(f)); scanf("%d%d%d",&n,&m,&l); for(int i=1;i<=n;i++) scanf("%d",&h[i]); f[1]=m; for(int i=2;i<=l;i++) { for(int j=1;j<=i-1;j++) f[i]=max(f[i-j]-spent(i,i-j),f[i]); } for(int i=l+1;i<=n;i++) { for(int j=1;j<=l;j++) f[i]=max(f[i-j]-spent(i,i-j),f[i]); } if(f[n]>=0) printf("%d\n",f[n]); else printf("-1\n"); } return 0; }
G.計算幾何
如果那個點不在射線的下方,ans=0。
如果在下方,該點必為射線與x軸所截的直線部分的中點。
#include<bits/stdc++.h> using namespace std; int main() { int t; int k; int x,y; double s=0; double x1,x2; scanf("%d",&t); while(t--) { x=0.0; x1=(x2=0.0); scanf("%d",&k); scanf("%d%d",&x,&y); if(k*x*y==0||y>=k*x) cout<<"0.000"<<endl; else { x2=(double)(2*y)/k; x1=2*x-x2; s=x1*x2*(double)k/2; printf("%.3f\n",s); } } return 0; }
未完