码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #324 (Div. 2)

时间:2016-04-02 22:42:40      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

今天写写cf上以前的水题,找找自信

 

A. Olesya and Rodion

此题要求一个能被t整除的n位数,直接t为开始,后面全部为0. 当然,需要排除位数为1但t=10的情况。

#include<cstdio>  
#include<cstring>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
  
int main()  
{  
    int n,t,i;  
    scanf("%d%d",&n,&t);  
    if (n==1 && t==10)   
        printf("-1\n"); 
    else  
    {  
        if (t==10)   
            t=1;  
        printf("%d",t);  
        for (int i=0;i<n-1;i++)  
            printf("0");  
        printf("\n");  
    }  
    return 0;  
}

B. Kolya and Tanya

给你一个环,环上有3n个点,每个点的权值可以是1-3,然后问你满足a[i]+a[i+1]+a[i+2]!=6的方案有多少种,具体做法是先求出反例的情况,即a[i]+a[i+1]+a[i+2]=6的情况,这三个数的取值一共有7种,那么答案就是 3^(3n) - 7^n

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

#define MOD 1000000007  

int n;  

LL pw(int a,int x)  
{  
    LL k=1;  
    for (int i=1;i<=x;i++)  
        k=(k*a)%MOD;  
    return k%MOD;  
}  
  
int main()  
{
  scanf("%d",&n);  
	printf("%I64d\n",(pw(27,n)-pw(7,n)+MOD)%MOD);  
    return 0;  
}

C. Marina and Vasya

要求与两个字符串的不同字符都为t的第三个字符串。 

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

typedef long long LL;

#define N 100010

int n,t;
int ans;
char a[N],b[N],c[N];

int main()  
{
      scanf("%d%d",&n,&t);
	scanf("%s%s",a+1,b+1);
	t=n-t;
	for (int i=1;i<=n;i++)
		if (a[i]==b[i])
			ans++;
	if (ans+(n-ans)/2<t)
	{
		printf("-1\n");	
		return 0;
	}
	int k=min(t,ans);
	for (int i=1,j=1;i<=n && j<=k;i++)
		if (a[i]==b[i])
			c[i]=a[i],j++;
	for (int i=1,j=1;i<=n && j<=t-k;i++)
		if (a[i]!=b[i] && !c[i])
			c[i]=a[i],j++;
	for (int i=1,j=1;i<=n && j<=t-k;i++)
		if (a[i]!=b[i] && !c[i])
			c[i]=b[i],j++;
	for (int i=1;i<=n;i++)
		if (!c[i])
			for (int j=‘a‘;j<=‘z‘;j++)
				if (a[i]!=j && b[i]!=j)
				{
					c[i]=j;
					break;
				}
	printf("%s\n",c+1);
	return 0;
}

D. Dima and Lisa

把一个数插成1或2或3个素数

 

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

typedef long long LL;

#define N 100010

int n;

bool check(int x) 
{
    for (int i=2;i<=sqrt(x);i++)
        if (x%i==0)
	  return false;
    return true;
}

int main()  
{
	 scanf("%d",&n);
	if (check(n))
	{
		printf("1\n%d",n);
		return 0;
	}
	for (int i=n;i;i-=2)
		if (check(i))
		{
			int k=n-i;
			if (check(k))
			{
				printf("2\n%d %d\n",i,k);
				return 0;
			}
			for (int j=k-2;j;j--)
				if (check(j) && check(k-j))
				{
					printf("3\n%d %d %d\n",i,j,k-j);
					return 0;
				}			
		}
	return 0;
}

E. Anton and Ira

给两个数组,要求让第一个数组变成第二个数组,可以进行交换操作

每次交换操作的代价是abs(i-j)

然后让你把方案输出出来

 

 

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

typedef long long LL;

#define N 2010
#define M 2000010

int a[N],b[N],c[N];
int l[M],r[M];

int n;
int ans,cnt;

int main()
{
        scanf("%d",&n);
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int i=1;i<=n;i++)
		scanf("%d",&b[i]),c[b[i]]=i;
	for (int i=1;i<=n;i++)
	{
		if (a[i]!=b[i])
		{
			int k=-1;
			for (int j=i+1;j<=n;j++)
				if (a[j]==b[i])
				{
					k=j;
					break;
				}
			while (k!=i)
				for (int j=i;j<k;j++)
					if (c[a[j]]>=k)
					{
						ans+=abs(k-j);
						swap(k,j);
						swap(a[k],a[j]);
						l[++cnt]=k;
						r[cnt]=j;
						break;
					}
		}
	}
	printf("%d\n%d\n",ans,cnt);
	for (int i=1;i<=cnt;i++)
		printf("%d %d\n",l[i],r[i]);
	return 0;
}

 

Codeforces Round #324 (Div. 2)

标签:

原文地址:http://www.cnblogs.com/yangjiyuan/p/5348412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!