示例#1
0
long long find_ans(int i,int j){
    if(table[i][j]!=0) return table[i][j];
    long long int min=999999999,prob;
    int k,ind;
    if(i-1>=1){
        ind=0;
        for(k=1;k<=n;k++){
            if(a[k]>0) ind++;
            if(a[k]==i-1) break;
        }
        a[k]=0;
        min=(j-i+2)*ind+find_ans(i-1,j);
        a[k]=i-1;
    }
    if(j+1<=n){
        ind=0;
        for(k=1;k<=n;k++){
            if(a[k]>0) ind++;
            if(a[k]==j+1) break;
        }
        a[k]=0;
        prob=(j-i+2)*ind+find_ans(i,j+1);
        if(prob<min) min=prob;
        a[k]=j+1;
    }
    if(min!=999999999) return table[i][j]=min;
    return 0;
}
示例#2
0
long long find_ans(int i,int j){
    if(table[i][j]!=-1) return table[i][j];
    //return table[i][j]=MIN((j-i+2)*ind[j][i][1]+find_ans(i,j+1),(j-i+2)*ind[j][i][0]+find_ans(i-1,j));
    long long int min=999999999,prob;
    int k;
    if(i-1>=1){
        /*ind=0;
        for(k=1;k<=n;k++){
            if(a[k]>0) ind++;
            if(a[k]==i-1) break;
        }
        a[k]=0;
        min=(j-i+2)*ind+find_ans(i-1,j);
        a[k]=i-1;*/
        min=ind[j][i][0]*(j-i+2)+find_ans(i-1,j);
    }
    if(j+1<=n){
        /*ind=0;
        for(k=1;k<=n;k++){
            if(a[k]>0) ind++;
            if(a[k]==j+1) break;
        }
        a[k]=0;
        prob=(j-i+2)*ind+find_ans(i,j+1);
        if(prob<min) min=prob;
        a[k]=j+1;*/
        prob=(j-i+2)* (ind[j][i][1])+find_ans(i,j+1);
        if(prob<min) min=prob;
    }
    if(min!=999999999) return table[i][j]=min;
    return 0;
}
示例#3
0
int main(){
    init();
    ll n,q,k;
    int t;
    scanf("%lld%lld",&n,&q);
    ll total=find_ans(n);
    while(q--){
        scanf("%d%lld",&t,&k);
        if(t==1){
            printf("%lld\n",find_ans(gcd(n,k)));
            continue;
        }
        if(n%k==0){
            ll m=n/k;
            ll ans=find_ans(m);
            if(t==2) printf("%lld\n",ans);
            else printf("%lld\n",total-ans);
        }
        else{
            if(t==2) puts("0");
            else printf("%lld\n",total);
        }
    }
    return 0;
}
示例#4
0
int main(){
    scanf("%d",&t);
    while(t--){
        memset(table,0,sizeof(table));
	   scanf("%d",&n);
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
            index[a[i]]=i;
        }
        int res=a[1];
        a[1]=0;
        long long min=1+find_ans(res,res),k;
        a[1]=res;
       // printf("%lld ",min);
	   for(i=2;i<=n;i++){
            res=a[i];
            a[i]=0;
            if((k=i+find_ans(res,res))<min) min=k;
            //printf("%lld ",k);
	    a[i]=res;
        }
        printf("%lld\n",min);
    }
    return 0;
}
示例#5
0
void find_ans(int*arr,int i){
    if(i<n){
            arr[i]=1;
            find_ans(arr,i+1);
            arr[i]=0;
            find_ans(arr,i+1);
        }
    else{
        int j;
        for(j=0;j<n;j++)
            printf("%d ",arr[j]);
        printf("\n");
        cnt++;
    }
}
示例#6
0
int main()
{
    char col;
    int row;
    FILE *fin = fopen("camelot.in", "r");
    fscanf(fin, "%d %d\n", &R, &C);
    fscanf(fin, "%c %d\n", &col, &row);
    king[0] = col - 'A' + 1;
    king[1] = row;
    while (2 == fscanf(fin, "%c %d\n", &col, &row)) {
        knights[num][0] = col - 'A' + 1;
        knights[num++][1] = row;
    }
    fclose(fin);
    
    int ans;
    ans = find_ans();
    
    FILE *fout = fopen("camelot.out", "w");
    fprintf(fout, "%d\n", ans);
    fprintf(stderr, "%d\n", ans);
    fclose(fout);
    
    exit(0);
}
示例#7
0
int main(){
    scanf("%d",&n);
    int arr[n+4];
    memset(arr,0,sizeof(arr));
    find_ans(arr,0);
    printf("\ntotal %ld",cnt);
    system("pause");
    return 0;
}
int main(){
	int L;
	
	find_ans();
	
	while(scanf("%d", &L) && L){
		printf("%llu\n", ans[L]);
	}
	return 0;
}
int main(){
  int N;
  int k, m;
  scanf("%d", &N);
  find_ans();
  while(N--){
    scanf("%d%d", &k, &m);
    printf("%d\n", ans[k][1][m]);
  }
  return 0;
}
示例#10
0
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int i,j,b;
        scanf("%d",&n);
        memset(ind,INF,sizeof(ind));
        memset(raw_ind,0,sizeof(raw_ind));
        memset(table,-1,sizeof(table));
        for(i=1;i<=n;i++){
            scanf("%d",&b);
            raw_ind[b]=i;
        }
        for(i=1;i<n;i++){
            ind[i][i][1]=raw_ind[i+1]-(raw_ind[i+1]>raw_ind[i]);
            for(j=i-1;j>0;j--){
                ind[i][j][1]=ind[i][j+1][1]-(raw_ind[i+1]>raw_ind[j]);
            }
        }
        for(j=2;j<=n;j++){
            ind[j][j][0]=raw_ind[j-1]-(raw_ind[j-1]>raw_ind[j]);
            for(i=j+1;i<=n;i++){
                ind[i][j][0]=ind[i-1][j][0]-(raw_ind[j-1]>raw_ind[i]);
            }
        }
        /*for(i=1;i<=n;i++){
            for(j=1;j<=n;j++)
                printf("%4d ",ind[i][j][1]);
            printf("\n");
        }
        printf("\n");
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++)
                printf("%4d ",ind[i][j][0]);
            printf("\n");
        }
        printf("\n");*/
        long long min=INF,k;
        for(i=1;i<=n;i++){
            if((k=raw_ind[i]+find_ans(i,i))<min) min=k;
            //printf("with %d min is %ld\n",i,k);
        }
        printf("%lld\n",min);
    }
    return 0;
}
示例#11
0
int main(){
	FILE* fin  = fopen("camelot.in" ,"r");
	FILE* fout = fopen("camelot.out","w");
#ifdef D
	fout = stdout;
#endif
	char c;
	int i,j,m,n;
	fscanf(fin,"%i %i\n",&R,&C);
	fscanf(fin,"%c %i\n",&c,&king_y);
	king_x = c -'A';king_y--;
	while(!feof(fin)){
		c = fgetc(fin);
		if(feof(fin))break;
		if( c == ' ' || c == '\n' )continue;
		knight_x[n_knight] = c - 'A';
		fscanf(fin,"%i",&knight_y[n_knight]);
		knight_y[n_knight++] --;
	}
	for(i=0;i<26;i++)for(j=0;j<30;j++){
		for(m=0;m<26;m++)for(n=0;n<30;n++)
			dist[i][j][m][n] = INF;
		dist[i][j][i][j] = 0;
	}
	/* do bfs */
	for(i=0;i<C;i++)for(j=0;j<R;j++)
		bfs_knight(i,j);
	bfs_king();
	/* sum all */
	for(m=0;m<n_knight;m++)
		for(i=0;i<26;i++)for(j=0;j<30;j++)
			d_all[i][j] += dist[knight_x[m]][knight_y[m]][i][j];
	#ifdef Ds
	p_map(dist[knight_x[0]][knight_y[0]]);
	p_map(d_all);
	#endif
	find_ans();
	fprintf(fout,"%i\n",mi_s);
	fclose(fin);
	fclose(fout);
	return 0;
}
示例#12
0
long long find_ans(long i,struct node *ptr)
{
        if(i==ptr->lc) return ptr->info;
        else if(i<ptr->lc) return find_ans(i,ptr->lchild);
        else return find_ans(i,ptr->rchild);
}