13年12月CCF_CSP

CSP冲冲冲

acwing 3192

  1. 出现次数最多的数

给定 nn 个正整数,找出它们中出现次数最多的数。

如果这样的数有多个,请输出其中最小的一个。

输入格式

输入的第一行只有一个正整数 nn,表示数字的个数。

输入的第二行有 nn 个整数 s1,s2,…,sns1,s2,…,sn。

相邻的数用空格分隔。

输出格式

输出这 nn 个次数中出现次数最多的数。

如果这样的数有多个,输出其中最小的一个。

数据范围

1≤n≤10001≤n≤1000,
1≤si≤100001≤si≤10000

输入样例:

6
10 1 10 20 30 20

输出样例:

10
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e4+10;
int a[maxn];
int main()
{
	int n,t;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>t;
		a[t]++;
	}
	int maxx=0,p=0;
	for(int i=1;i<=10000;i++)
	{
		if(a[i]>maxx)
		{
			maxx=a[i];
			p=i;
		}
	}
	printf("%d\n",p);
	return 0;
}

acwing 3193

\3193. ISBN号码

每一本正式出版的图书都有一个 ISBN 号码与之对应。

ISBN 码包括 99 位数字、11 位识别码和 33 位分隔符,其规定格式如 x-xxx-xxxxx-x,其中符号 - 是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4 就是一个标准的ISBN码。

ISBN 码的首位数字表示书籍的出版语言,例如 00 代表英语;第一个分隔符 - 之后的三位数字代表出版社,例如 670670 代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。

识别码的计算方法如下:

首位数字乘以 11 加上次位数字乘以 22……以此类推,用所得的结果 mod11mod11,所得的余数即为识别码,如果余数为 1010,则识别码为大写字母 XX。

例如 ISBN 号码 0-670-82162-4 中的识别码 44 是这样得到的:对 067082162067082162 这 99 个数字,从左至右,分别乘以 1,2,…,91,2,…,9,再求和,即 0×1+6×2+……+2×9=1580×1+6×2+……+2×9=158,然后取 158mod11158mod11 的结果 44 作为识别码。

编写程序判断输入的 ISBN 号码中识别码是否正确,如果正确,则仅输出 Right;如果错误,则输出是正确的 ISBN 号码。

输入格式

输入只有一行,是一个字符序列,表示一本书的 ISBN 号码(保证输入符合 ISBN 号码的格式要求)。

输出格式

输出一行,假如输入的 ISBN 号码的识别码正确,那么输出 Right,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符 -)。

输入样例1:

0-670-82162-4

输出样例1:

Right

输入样例2:

0-670-82162-0

输出样例2:

0-670-82162-4
#include <iostream>
using namespace std;
int main()
{
	string s;
	cin>>s;
	int k=1,ans=0;
	for(int i=0;i<11;i++)
	{
		if(i==1 || i==5) continue;
		ans=ans+(s[i]-'0')*k;
		k++;
	}
	ans=ans%11;
	if(ans==s[12]-'0' || (ans==10 && s[12]=='X'))
		printf("Right");
	else
	{
		if(ans==10) s[12]='X';
		else s[12]='0'+ans;
		cout<<s;
	}
	return 0;
}

acwing 3194

\3194. 最大的矩形

在横轴上放了 nn 个相邻的矩形,每个矩形的宽度是 11,而第 ii(1≤i≤n1≤i≤n)个矩形的高度是 hihi。

这 nn 个矩形构成了一个直方图。

例如,下图中六个矩形的高度就分别是 3,1,6,5,2,33,1,6,5,2,3。

p31.png

请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。

对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是 1010。

p32.png

输入格式

第一行包含一个整数 nn,即矩形的数量。

第二行包含 nn 个整数 h1,h2,…,hnh1,h2,…,hn,相邻的数之间由空格分隔。hihi 是第 ii 个矩形的高度。

输出格式

输出一行,包含一个整数,即给定直方图内的最大矩形的面积。

数据范围

1≤n≤10001≤n≤1000,
1≤hi≤100001≤hi≤10000

输入样例:

6
3 1 6 5 2 3

输出样例:

10
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int a[maxn];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	int maxx=n,cnt=0;
	for(int i=2;i<=10000;i++)
	{
		cnt=0;
		for(int j=1;j<=n+1;j++)
		{
			if(a[j]>=i)
			{
				cnt++;
			}
			else
			{
				maxx=max(maxx,i*cnt);
				cnt=0;
			}
		}
	}
	cout<<maxx;
	return 0;
}

acwing 3195

\3195. 有趣的数

我们把一个数称为有趣的,当且仅当:

  1. 它的数字只包含 0,1,2,30,1,2,3,且这四个数字都出现过至少一次。
  2. 所有的 00 都出现在所有的 11 之前,而所有的 22 都出现在所有的 33 之前。
  3. 最高位数字不为 00。

因此,符合我们定义的最小的有趣的数是 20132013。

除此以外,44 位的有趣的数还有两个:20312031 和 23012301。

请计算恰好有 nn 位的有趣的数的个数。

由于答案可能非常大,只需要输出答案除以 109+7109+7 的余数。

输入格式

输入只有一行,包括恰好一个正整数 nn。

输出格式

输出只有一行,包括恰好 nn 位的整数中有趣的数的个数除以 109+7109+7 的余数。

数据范围

4≤n≤10004≤n≤1000

输入样例:

4

输出样例:

3

思路:递推

需要满足以下的条件
0在1之前
2在3之前
则有以下6种状态
0-- 0 1 (2) 3 出现2
1-- (0) 1 (2) 3 出现0和2
2-- 0 1 (2) (3) 出现2和3
3-- (0) (1) (2) 3 出现0,1,2
4-- (0) 1 (2) (3) 出现0,2,3
5-- (0) (1) (2) (3) 出现0,1,2,3
f[i][0]表示0状态的次数,只有一个数的时候次数为1
f[i][1]表示1状态的次数,填充第i位使得状态为1状态。
有两种情况如果是0状态则只能填充(0),如果是1状态本身,则可以填充(0)或者(2)所以
f[i][1]=(f[i-1][1]*2+f[i-1][0])%mod;
#include <iostream>
using namespace std;
typedef long long ll;
const int maxn = 1010;
const int mod = 1e9+7;
ll f[maxn][6];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		f[i][0]=1;
		f[i][1]=(f[i-1][1]*2+f[i-1][0])%mod;
		f[i][2]=(f[i-1][2]+f[i-1][0])%mod;
		f[i][3]=(f[i-1][3]*2+f[i-1][1])%mod;
		f[i][4]=(f[i-1][4]*2+f[i-1][2]+f[i-1][1])%mod;
		f[i][5]=(f[i-1][5]*2+f[i-1][4]+f[i-1][3])%mod;
	}
	cout<<f[n][5];
	return 0;
}

acwing 3196dfs

在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 55;

int n,m;
char g[N][N];
bool st1[N][N],st2[N][N];
int dx[] = {-1,0,1,0},dy[]={0,1,0,-1};

bool check(int x,int y,int k)
{
    char c=g[x][y];
    if(c=='+' || c=='S' || c=='T') return true;
    if(c=='-' && k%2==1) return true;
    if(c=='|' && k%2==0) return true;
    if(c=='.' && k==2) return true;
    return false;
}

void dfs1(int x,int y)
{
    st1[x][y]=true;
    for(int i=0;i<4;i++)
    {
        int a=x+dx[i],b=y+dy[i];
        if(a<0 || a>=n || b<0 || b>=m || g[a][b]=='#') continue;
        if(st1[a][b]) continue;
        if(check(x,y,i)) dfs1(a,b);
    }
}

void dfs2(int x,int y)
{
    st2[x][y]=true;
    for(int i=0;i<4;i++)
    {
        int a=x+dx[i],b=y+dy[i];
        if(a<0 || a>=n || b<0 || b>=m || g[a][b]=='#') continue;
        if(st2[a][b]) continue;
        if(check(a,b,i^2)) dfs2(a,b);
    }
}

int main()
{
    cin>>n>>m;
    int tx,ty;
    for(int i=0;i<n;i++) cin>>g[i];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            if(g[i][j]=='S') dfs1(i,j);
            else if(g[i][j]=='T')
            {
                tx=i,ty=j;
                dfs2(i,j);
            }
    }
    if(!st1[tx][ty]) puts("I'm stuck!");
    else
    {
        int res=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(st1[i][j] && !st2[i][j])
                    res++;
        cout<<res<<endl;
    }
    return 0;
}
posted @ 2022-05-11 21:01  爱xiaoyi  阅读(32)  评论(0)    收藏  举报