T1
楊輝三角算組合數+二維前綴和
水爆
分值:100
CODE
#include<cstdio>
#define N 2005
int C[N][N],cnt[N][N],t,k,n,m;
int main() {
scanf("%d %d",&t,&k);
for(int i=1;i<=2000;i++){
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++){
cnt[i][j]=cnt[i-1][j]+cnt[i][j-1]-cnt[i-1][j-1];
C[i][j]=(C[i-1][j]+C[i-1][j-1])%k;
if(C[i][j]==0)cnt[i][j]++;
}
cnt[i][i]=cnt[i][i-1];
}
while(t--) {
scanf("%d %d",&n,&m);
printf("%d\n",cnt[n][n<m?n:m]);
}
return 0;
}
T2
三個數組模擬單調隊列
分值:100
CODE
#include<cstdio>
#include<algorithm>
#define N 100005
#define M 7100005
using namespace std;
int n,m,q,u,v,t;
double p;
int Q[N],Q2[M],Q3[M],l1=1,l2=1,l3=1,r1,r2,r3;
inline int top() {
int t1=-2e9,t2=-2e9,t3=-2e9;
if(l1<=r1)t1=Q[l1];
if(l2<=r2)t2=Q2[l2];
if(l3<=r3)t3=Q3[l3];
if(t1>=t2&&t1>=t3) {
l1++;
return t1;
}
if(t2>=t1&&t2>=t3) {
l2++;
return t2;
}
l3++;
return t3;
}
bool cmp(int _,int __) {return _>__;}
int main() {
int i;
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=1.0*u/v;
for(i=1; i<=n; i++)scanf("%d",&Q[i]);
sort(Q+1,Q+1+n,cmp);
r1=n;
int inc=0;
for(i=1; i<=m; i++) {
int x=top()+inc;
inc+=q;
Q2[++r2]=floor(x*p)-inc;
Q3[++r3]=x-floor(x*p)-inc;
if(i%t==0)printf("%d ",x);
}
puts("");
for(i=1; i<=n+m; i++) {
int ans=top();
if(i%t==0)printf("%d ",ans+q*m);
}
return 0;
}
T3
狀壓dp
分值:100
CODE
#include<cstdio>
#include<memory.h>
struct node {double x,y;} A[20];
int B[405],dp[1<<19];
inline void Min(int &x,int y){if(x>y)x=y;}
inline double Abs(double x){return x>0?x:-x;}
inline node calc(node x,node y) {
double y1=x.y,y2=y.y;
double k1=x.x*x.x,k2=y.x*y.x;
double b1=x.x,b2=y.x;
double s1=k1/k2,s2=b1/b2;
node t;
t.y=(y1-y2*s1)/(b1-b2*s1);
t.x=(y1-y2*s2)/(k1-k2*s2);
return t;
}
inline bool Judge(node a,node x,node y) {
if(Abs(a.x*x.x*x.x+a.y*x.x-x.y)>1e-6)return 0;
if(Abs(a.x*y.x*y.x+a.y*y.x-y.y)>1e-6)return 0;
return 1;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%lf%lf",&A[i].x,&A[i].y);
int n1=0;
for(int i=1; i<=n; i++) {
for(int j=i+1; j<=n; j++) {
node a1=calc(A[i],A[j]);
if(a1.x>=0||!Judge(a1,A[i],A[j]))continue;
int h=(1<<(i-1))|(1<<(j-1));
for(int k=j+1; k<=n; k++)
if(Judge(a1,A[i],A[k]))
h+=(1<<(k-1));
B[++n1]=h;
}
B[++n1]=1<<(i-1);
}
memset(dp,63,sizeof dp);
dp[0]=0;
for(int i=0; i<(1<<n); i++)
for(int j=1; j<=n1; j++)
Min(dp[i|B[j]],dp[i]+1);
printf("%d\n",dp[(1<<n)-1]);
}
return 0;
}