您的位置:首页 > 其它

[Codeforces]Round246 div2 解题报告

2014-05-26 10:10 393 查看
这一场的还是在拼手速=——=

第一次上1600呢 纪念一下~

A. Choosing Teams
http://codeforces.com/contest/432/problem/A
刷榜题 统计小于等于5-k的人数的个数 结果除以3

#include<cstdio>  
#include <cstring>
#include <cmath>
using namespace std;
int i,o,p,j,k,l,n,m,a[100000],b[100000],ans;
int main()  
{  
    scanf("%d%d",&n,&k);
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    for (i=1;i<=n;i++)
    {
    scanf("%d",&a[i]);
    ++b[a[i]];
    }
    ans=0;
    for (i=0;i<=5-k;i++)
    ans+=b[i];
    printf("%d",ans/3);
    return 0;  
}


B. Football Kit
http://codeforces.com/contest/432/problem/A
刷榜题 统计客场球衣别人主场球衣重复的次数,加到主场球衣次数中
#include<cstdio>  
#include <cstring>
#include <cmath>
using namespace std;
int i,o,p,j,k,l,n,m,a[100005],b[100005],d[100005],e[100005],c[100005],ans;
int main()  
{  
	scanf("%d",&n);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	memset(d,0,sizeof(d));
	memset(e,0,sizeof(e));
	for (i=1;i<=n;i++)
	{
	scanf("%d",&a[i]);
	scanf("%d",&b[i]);
	}
	for (i=1;i<=n;i++)
	{
		++c[a[i]];
	}
	for (i=1;i<=n;i++)
	{
		d[i]=n-1;
		d[i]+=c[b[i]];
		e[i]+=n-1-c[b[i]];
	}
	for (i=1;i<=n;i++)
	{
	printf("%d %d\n",d[i],e[i]);
	}
	
	return 0;  
}


C. Prime Swaps
http://codeforces.com/contest/432/problem/C 贪心,每次统计距离目标最近的素数。
#include<cstdio>  
#include <cstring>
#include <cmath>
using namespace std;
int i,o,p,j,k,l,n,m,a[100100],b[100100],d[100100],s[1000100][3],c[100100],ans;
void swapi(int x,int y)
{
	int t1,t2;
	t1=x;
	t2=y;
	d[b[x]]=t2;
	d[b[y]]=t1;
	m=b[x];
	b[x]=b[y];
	b[y]=m;
}
int main()  
{  
	memset(a,0,sizeof(a));
	p=o=0;
	a[1]=1;
	for (i=2;i<=100100;i++)
		if (!a[i])
		{
		b[++o]=i;
		for (j=2*i;j<=100100;j+=i)
		a[j]=1;
		}
	scanf("%d",&n);
	o=1;
	a[1]=1;
	for (i=1;i<=100100;i++)
		{
		if (i>=(b[o+1]-1)) o++;
		a[i]=b[o]-1;
		}
	for (i=1;i<=n;i++)
		{
		scanf("%d",&b[i]);
		//b[i]=n+1-i;
		d[b[i]]=i;
		}
	for (i=1;i<=n;i++)
	{
	k=d[i];
	while (k-i)
	{
		ans++;
		s[ans][1]=k-a[k-i];
		s[ans][2]=k;
		swapi(s[ans][1],s[ans][2]);
		k-=a[k-i];
	}
	}
	printf("%d\n",ans);
	for (i=1;i<=ans;i++)
	printf("%d %d\n",s[i][1],s[i][2]);
	return 0;  
}


D题暂时空,后缀数组还需掌握

E. Square Tiling
http://codeforces.com/contest/432/problem/E
比赛的时候没出这道题,贪心的方式错了,每次往外再染色一层点都要看是不是存在字典学更小的方案。
http://codeforces.com/contest/432/submission/6630816 WA在第六组

AC代码
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
char a[105][105],b[305];
char backu(int x,int y,int h,char p)
{
    char tmp;
    int i,j;
    for (tmp='A';tmp<='Z';tmp++)
        b[tmp]=0;
    b[p]=1;
    for (i=x;i<=x+h-1;i++)  
        b[a[i][y-1]]=1;
    for (i=x;i<=x+h-1;i++)  
        b[a[i][y+h]]=1;
    for (j=y;j<=y+h-1;j++)  
        b[a[x-1][j]]=1;
    for (tmp='A';tmp<='Z';tmp++)
        if (b[tmp]==0)return tmp;
}
int main()
{
    int i,n,t,m,j,k,ii,jj;
    char h;
        scanf("%d%d",&n,&m);
        for (i=0;i<=n+1;i++)
            for (j=0;j<=m+1;j++)
                a[i][j]='A'-1;
        for (i=1;i<=n;i++)
            for (j=1;j<=m;j++)
                if (a[i][j]=='A'-1)
                {
                    for (k=1;(i+k-1<=n&&j+k-1<=m&&a[i+k-1][j]=='@'&&a[i][j+k-1]=='@');k++)
                    {h=backu(i,j,k,'@');
                    if (h>backu(i,j+k-1,1,h)) break;}
                    k-=1;
                    h=backu(i,j,k,'@');
                    for (ii=i;ii<=i+k-1;ii++)
                        for (jj=j;jj<=j+k-1;jj++)
                            a[ii][jj]=h;
            //  printf("%d %d %d %c\n",i,j,k,h);
                }
            for (i=1;i<=n;i++){
                for (j=1;j<=m;j++)
                printf("%c",a[i][j]);
                printf("\n");}
    
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: