首页 > 代码库 > Codeforces 802 补题

Codeforces 802 补题

A

水题 同B

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int maxn=1000000;
int n,k,a[maxn],num;
bool ex[maxn],need[maxn];
int main()
{//freopen("t.txt","r",stdin);
 scanf("%d%d",&n,&k);
 num=0;
 memset(ex,0,sizeof(ex));
 for(int i=0;i<n;i++)
 	scanf("%d",&a[i]);
 int ans=0;
 for(int i=0;i<n;i++)
 	{
     if(ex[a[i]]) continue;	
     if(num<k)
     	{
     	 num++;
     	 ans++;
     	 ex[a[i]]=true;
		}
		else
			{
			 int sum=0;
			 memset(need,0,sizeof(need));
			 for(int j=i+1;j<n&&sum<k-1;j++)
			 	{
			 	 if(!ex[a[j]])continue;
			 	 
			 	 if(need[a[j]]==false)sum++;
			 	 need[a[j]]=true;
				}
			 for(int j=1;j<=n;j++)
			 	{
			 	 if(ex[j]&&(!need[j])){ex[j]=false;ex[a[i]]=true;ans++;break;}
				}
			}
 	}
 printf("%d\n",ans);
 return 0;
}

  

B

C

D

根据泊松分布的特点,对称轴两边的概率密度最大。

用这个特点来判断是泊松分布还是平均分布。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; 
int a[250],b[250];
int main()
{
 int T;
 scanf("%d",&T);
 while(T--)
 	{
 	 
 	 for(int i=0;i<250;i++)scanf("%d",&a[i]);
 	 //for(int i=0;i<250;i++)scanf("%d",&b[i]);
 	 int mina=a[0],maxa=a[0],minb=b[0],maxb=b[0];
 	 double mida=0;
 	 for(int i=0;i<250;i++)
 	 	{
 	 	 mida+=a[i];
 	 	 //minb=min(minb,b[i]);maxb=max(maxb,b[i]);
		}
	 mida/=250.;
	 int sum=0,sumb=0;
	 double len=mida/2;
	 for(int i=0;i<250;i++)
	 	{
	 		if(a[i]>(mida-len)&&a[i]<(mida+len))sum++;
	 		if(a[i]<=1)sumb++;
		}
	 if(sum<180||sumb>3)printf("uniform\n");
	 	else printf("poisson\n");
	}
 return 0;
}

  

E

F

G

公共子序列问题 O(N^2)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<string>
#include<vector>
#include<cstring>
using namespace std;
int dp[1000][1000];
int LCS(int n1,int n2,string s1,string s2)
{
 for(int i=0;i<n1;i++)
 	for(int j=0;j<n2;j++)
 		{
 		 if(i>0)dp[i][j]=dp[i-1][j];
		 if(j>0&&dp[i][j-1]>dp[i][j])dp[i][j]=dp[i][j-1];
		 if(s1[i]==s2[j])
		 	{
		 	 if(i==0||j==0)dp[i][j]=1;
		 	 else dp[i][j]=dp[i-1][j-1]+1;	
			}
		}
 return dp[n1-1][n2-1];
}
int main()
{//freopen("t.txt","r",stdin);
 ios::sync_with_stdio(false);
 string s1,s2;
 s2="heidi";
 while(cin>>s1)
 	{
 	 memset(dp,0,sizeof(dp));
 	 int len=LCS(s1.length(),s2.length(),s1,s2);
 	 if(len==5)printf("YES\n");
 	 	else printf("NO\n");
	 s1.clear();s2.clear();	
	}
 return 0;
}

  

H

I

J

水题

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<string>
#include<vector>
#include<cstring>
using namespace std;
vector<int>adj[200];
int w[200][200];
int dist[200];
void dfs(int cur,int fa,int len)
{
 for(int i=0;i<adj[cur].size();i++)
 	{
 	 int ne=adj[cur][i];
 	 if(ne==fa)continue;
 	 dist[ne]=min(dist[ne],len+w[cur][ne]);
 	 dfs(ne,cur,len+w[cur][ne]);
	}
}
int main()
{//freopen("t.txt","r",stdin);
 int n;
 scanf("%d",&n);
 int u,v;
 for(int i=0;i<n-1;i++)
 	{
 	 scanf("%d%d",&u,&v);
 	 scanf("%d",&w[u][v]);
 	 w[v][u]=w[u][v];
 	 adj[u].push_back(v);
 	 adj[v].push_back(u);
	}
 for(int i=1;i<n;i++)
 	dist[i]=99999999;
 dist[0]=0;
 dfs(0,-1,0);
 int ans=0;
 for(int i=0;i<n;i++)
 	ans=max(ans,dist[i]);
 printf("%d\n",ans);
 return 0;
}

  

K

L

M

每个序列排序后前k个数的和

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int num[3000];
int main()
{//freopen("t.txt","r",stdin);
 int n,m,t;
 int mins=-1;
 scanf("%d%d",&n,&m);
 for(int i=0;i<n;i++)
 {
 
 	scanf("%d",&num[i]);
 }
 sort(num,num+n);
  int ans=0;
 for(int i=0;i<m;i++)
 	ans+=num[i];
 printf("%d\n",ans);
 return 0;
}

  

Codeforces 802 补题