2017.10.30离线赛总结

problem ——4133

思路:组合数,mod k即可…

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;

#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define LL long long 
#define db double 
#define INF 0x7fffffff

#define N 2005
#define M 20

int T,n,m,k;
int C[N][N],f[N][N];
int main(){
//  freopen("problem.in","r",stdin);
//  freopen("problem.out","w",stdout);
    cin>>T>>k;
    REP(i,0,N-5){
        C[i][0]=1;
        REP(j,1,i){
            C[i][j]=C[i-1][j]+C[i-1][j-1];
            if(C[i][j]>=k)C[i][j]-=k;
            f[i][j]=f[i][j-1]+!C[i][j];
        }
    }
    while(T--){
        scanf("%d%d",&n,&m);
        int ans=0;
        REP(i,0,n)ans+=f[i][min(i,m)];
        printf("%d\n",ans);
    }
    return 0;
}

earthworm ——4134

思路:贪心…将3个队列来存切的蚯蚓,左儿子蚯蚓,右儿子蚯蚓… md水题呀!!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;

#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define LL long long 
#define db double 
#define INF 0x3f3f3f3f

#define N 100005

int n,m,q,u,v,t;
db p;
int A[N],B[N];

int cmp(int a,int b){return a>b;} 

struct p3{
    int Q[4][N*100];
    int l[4],r[4],add;
    int get(){
        int a=-INF,b=-INF,c=-INF,ans=1;
        if (l[1]<r[1]) a=Q[1][l[1]];
        if (l[2]<r[2]) b=Q[2][l[2]];
        if (l[3]<r[3]) c=Q[3][l[3]];
        if (a<b) a=b,ans=2;
        if (a<c) a=c,ans=3;
        return ans;
    }
    void solve(){
//      printf("%d\n",sizeof(Q)/1024/1024);
        sort(A+1,A+1+n,cmp);
        REP(i,1,n)Q[1][r[1]++]=A[i];
        REP(i,1,m){
            int k=get();
            int x=Q[k][l[k]++]+add;
            if (i%t==0){
                if (i>t)putchar(' ');
                printf("%d",x);
            }
            int a=floor(p*(db)x),b=x-floor(p*(db)x);
            add+=q;
            Q[2][r[2]++]=a-add,Q[3][r[3]++]=b-add;
        }
        puts("");
        REP(i,1,n+m){
            int k=get();
            int x=Q[k][l[k]++]+add;
            if (i%t==0){
                if (i>t)putchar(' ');
                printf("%d",x);
            }
        }
    }
}p3;
int main(){
//  freopen("earthworm.in","r",stdin);
//  freopen("earthworm.out","w",stdout);
    cin>>n>>m>>q>>u>>v>>t;
    p=1.0*u/v;
    REP(i,1,n)scanf("%d",&A[i]);

//  if(!m)p1.solve();
//  else if(!q)p2.solve();
//  else p3.solve(); 
    p3.solve();
    return 0;
}

angrybirds ——4135

思路:状压dp,啊,考试时看了好久才看出来,然而debug不出来,无fuck说…

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;

#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define LL long long 
#define db double
#define INF 0x7fffffff

#define N 20

const db eps=1e-9;
int T,n,m;
db a,b,x[N],y[N];
int sum[N][N],dp[1<<N];

void Clear() {
    a=b=0;
    memset(sum,0,sizeof(sum));
    memset(dp,127,sizeof(dp));
}
int check(db x) {
    if (x<=eps&&x>-eps)return 0;
    if (x>eps)return 1;
    return -1;
}
void calc(db &a,db &b,int id1,int id2) {
    a=b=0;
    db A=x[id1],B=y[id1],C=x[id2],D=y[id2];
    if(!check(A-C))return;
    a=(B*C-A*D)/(A*A*C-A*C*C);
    b=(B*C*C-D*A*A)/(A*C*C-A*A*C);
}
bool on(int id1,db a,db b){
    db A=x[id1],B=y[id1];
    if(!check(A*A*a+A*b-B)) return 1;
    return 0;
}
void Init() {
    REP(i,1,n)
        REP(j,i+1,n){
            calc(a,b,i,j);
            if(a>=0)continue;
            REP(k,1,n)if(on(k,a,b))sum[i][j]|=1<<(k-1);
        }
}
int main() {
//    freopen("angrybirds.in","r",stdin);
//    freopen("angrybirds.out","w",stdout);
    cin>>T;
    while(T--){
        Clear();
        scanf("%d%d",&n,&m);
        REP(i,1,n)scanf("%lf%lf",&x[i],&y[i]);
        Init();
        dp[0]=0;
        REP(i,0,(1<<n)-1){
            REP(j,1,n){
                if((i&(1<<(j-1)))==0){
                    REP(k,j+1,n)if((i&(1<<(k-1)))==0)dp[i|sum[j][k]]=min(dp[i|sum[j][k]],dp[i]+1);
                    dp[i|(1<<(j-1))]=min(dp[i|(1<<(j-1))],dp[i]+1);
                    break;
                }
            }
        }
        printf("%d\n",dp[(1<<n)-1]);
    }
}

小结:还是我太菜了,第2题的暴力写错了而且数组还开小了…第3题状压dp bug没de出来,可以此类题还是做的太少了,同时也要多总结dp了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值