Codeforces Round #324 (Div. 2)

今天写写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;
}
时间: 2024-10-10 17:54:39

Codeforces Round #324 (Div. 2)的相关文章

Codeforces Round #324 (Div. 2) (快速判断素数模板)

蛋疼的比赛,当天忘了做了,做的模拟,太久没怎么做题了,然后C题这么简单的思路却一直卡到死,期间看了下D然后随便猜了下,暴力了下就过了. A.找一个能被t整除的n位数,那么除了<=10以外,其他都可以用长度为n的10或100,1000 ... 来往上加几个数而得到 #include <iostream> #include <stdio.h> #include <set> #include <algorithm> #include <string.h

Codeforces Round #324 (Div. 2)C. Marina and Vasya set

                                                      C. Marina and Vasya Marina loves strings of the same length and Vasya loves when there is a third string, different from them in exactly t characters. Help Vasya find at least one such string. Mor

Codeforces Round #324 (Div. 2) D. Dima and Lisa (哥德巴赫猜想 + 暴力)

D. Dima and Lisa Dima loves representing an odd number as the sum of multiple primes, and Lisa loves it when there are at most three primes. Help them to represent the given number as the sum of at most than three primes. More formally, you are given

Codeforces Round #324 (Div. 2) E

这题贪心,考虑先放第一个,然后从第一个数在p中的位置, 不断的往前走,和在他后面的那些数组进行交换,因为这样交换可以提高最大的效率,就是说你花费了1但是使得两个点都朝他的木匾节点减少了1 #include <iostream> #include <algorithm> #include <cstdio> #include <vector> #include <cmath> using namespace std; const int maxn=2

Codeforces Round #324 (Div. 2) D - Dima and Lisa(哥德巴赫猜想)

1 #include<bits/stdc++.h> 2 using namespace std; 3 4 /** 5 据哥德巴赫猜想:任意一个偶数可以拆成两个质数 6 n-- 直到质数 t , n-t 是偶数 , 将n-t 拆分成两个质数 7 8 */ 9 10 bool check(int x) { 11 for (int i = 2; i * i <= x; i++) 12 if (x % i == 0) return false; 13 return true; 14 } 15 1

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我