Codeforces Round #289 Div 2

A. Maximum in Table

题意:给定一个表格,它的第一行全为1,第一列全为1,另外的数满足a[i][j]=a[i-1][j]+a[i][j-1],求这个表格中的最大的数

a[n][n]即为最大的数

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;
int a[12][12],n;
int main()
{
	int i,j,max;
	scanf("%d",&n);
	memset(a,0,sizeof(a));
	for(j=1;j<=n;j++)
	a[1][j]=1;
		for(i=1;i<=n;i++)
	a[i][1]=1;
	
	for(i=2;i<=n;i++)
	for(j=2;j<=n;j++)
	{
			a[i][j]=a[i-1][j]+a[i][j-1];
	}
	printf("%d
",a[n][n]);	
}

  

B. Painting Pebbles

题意:给定n堆卵石,以及k种颜色,现在给它们上色,要求任意两堆石头的颜色为c的石头个数相差小于等于1

首先将这n堆石头排序,如果k<max-min,那么肯定不能满足 如果k>max-min,那么一定是每一堆石头重复的颜色越少,越能够满足这个条件,所以对每一堆石头,就从第一种颜色开始涂色,依次涂上1 2 3 ---如果石头的个数超过了颜色的种类,则当前涂到第j个石头,用j对k取余,即为该石头的颜色。

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;
int b[305][305];
struct node
{
	int num;
	int order;
} a[305];
bool cmp(node n1,node n2)
{
	return n1.num<n2.num;
}
bool cmp0(node n1,node n2)
{
	return n1.order<n2.order;
}
int main()
{
	int n,k,i,j,ans;
	scanf("%d %d",&n,&k);
	memset(b,0,sizeof(b));
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i].num);
		a[i].order=i;
	}
	sort(a+1,a+1+n,cmp);
	
	if(k<a[n].num-a[1].num)
	printf("NO
");
	else
	{
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=a[i].num;j++)
			{
				b[a[i].order][j]=j%k;
				if(j%k==0)
				b[a[i].order][j]=k;
			}
		}
		printf("YES
");
		sort(a+1,a+n+1,cmp0);
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=a[i].num;j++)
			printf("%d ",b[a[i].order][j]);
			printf("
");
			
		}	
	}
	
	
	
}

 E. Pretty Song

题意:给出一串字符串,规定如果字母是A,E,I,O,U,Y,它的值为1,否则其值为0,    w=该子串中元音字母的个数(即有多少个1)/  该子串的长度

我们要计算的就是所有w的和

下面的思路是借鉴别人的思路---

可以令sum[i]为以第i个字母结尾有多少个元音字母,

当子串的长度为1的时候,每个字符都被计算了一次 tmp+=sum[len]-sum[1]

当子串的长度为2的时候,每个字符除了第一个字符和最后一个字符计算一次,其余的都被计算了两次,所以tmp+=sum[len-1]-sum[2]

以样例 Y I S V O W E L为例

长度为1的子串 Y,I,S,V,O,W,E,L 每个字符都被计算了1次 tmp+=sum[len]-sum[0];

长度为2的子串 YI,IS,SV,VO,OW,WE,EL 所以可以看到除了首字母和最后一个字母都被计算了两次--

剩下的就可以以此类推----

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;
long long  sum[1000010],l,r,len,tmp;
char s[1000010];
int main()
{
	int i;
	double ans=0;
	scanf("%s",s+1);
	len=strlen(s+1);
	memset(sum,0,sizeof(sum));
	for(i=1;i<=len;i++)
	sum[i]=sum[i-1]+1*(s[i]=='A'||s[i]=='E'||s[i]=='I'||s[i]=='O'||s[i]=='U'||s[i]=='Y');
	
	l=0;
	r=len;
	for(i=1;i<=len;i++)
	{
		tmp+=sum[r]-sum[l];
		ans+=tmp*1.0/i;
		r--;l++;	
	}
	printf("%.7lf
",ans);		
}
原文地址:https://www.cnblogs.com/wuyuewoniu/p/4265269.html