【Codeforeces】【#259】【Div.2】

紫名了好开心>_< 这次怒涨100+

A:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n/2;i++){
		string s;
		for(int j=1;j<=(n-(2*i-1))/2;j++)
		putchar('*');
		for(int j=1;j<=2*i-1;j++)
		putchar('D');
		for(int j=1;j<=(n-(2*i-1))/2;j++)
		putchar('*');
		puts("");
	}
	for(int i=1;i<=n;i++)putchar('D');puts("");
	
	for(int i=n/2;i>=1;i--){
		string s;
		for(int j=1;j<=(n-(2*i-1))/2;j++)
		putchar('*');
		for(int j=1;j<=2*i-1;j++)
		putchar('D');
		for(int j=1;j<=(n-(2*i-1))/2;j++)
		putchar('*');
		puts("");
	}
	return 0;
}

B:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n;
int a[maxn];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",a+i);
	int pos=-1,ans=0;
	for(int i=1;i<n;i++){
		if(a[i+1]<a[i]){pos=i;ans=n-i;break;}
	}
	if(pos==-1){
		puts("0");
		return 0;
	}
	if(a[n]>a[1]){
		puts("-1");
		return 0;
	}
	int ok=1;
	for(int i=pos+1;i<n;i++){
		if(a[i+1]<a[i])ok=0;
	}
	if(ok)printf("%d\n",ans);else puts("-1");
	return 0;
}
C:

#include<bits/stdc++.h>
using namespace std;
int n,m;
const double eps=1e-8;
int main(){
    cin>>m>>n;
    double ans=0,can=1;
    for(int i=m;i>=1;i--){
        ans+=can*(1-pow((double)(i-1)/i,n))*i;
        can=can*pow((double)(i-1)/i,n);
    }printf("%lf",ans);
    return 0;
} 

D题状压dp

一坨数互质,也就是说他们的质因子没有重复的

f[i][S]表示1..i,已使用了S集合的质因子的最小代价

f[i][S]=f[i-1][S']+w

#include<bits/stdc++.h>
using namespace std;
int p[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
int n,m;
int a[101];
int f[101][1<<17];
int g[101][1<<17];
int nb[101][1<<17];
void out(int n,int i){
	if(n==0)return;
	out(n-1,g[n][i]);
	printf("%d ",nb[n][i]);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	memset(f,0x3f,sizeof(f));
	f[0][0]=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=59;j++){
			int w=abs(j-a[i]),num=j;
			int test=0;
			for(int k=0;k<16;k++)while(num%p[k]==0)num/=p[k],test|=(1<<k);
			for(int k=0;k<(1<<16);k++){
				if(k&test)continue;
				int x=k|test;
				if(f[i][x]>f[i-1][k]+w)
					f[i][x]=f[i-1][k]+w,g[i][x]=k,nb[i][x]=j;
			}
		}
	}
	int minn=INT_MAX,pos=-1;
	for(int i=0;i<(1<<16);i++){
		if(minn>f[n][i]){
			minn=f[n][i];
			pos=i;
		}
	}
	out(n,pos);
	return 0;
}


E太神了不会做

你可能感兴趣的:(codeforces)