2020.2.5普及C组模拟赛3

普及C组模拟赛3

1.最大值
题目描述

给定n个数,{x1,x2,…,xn}要求从中选出至少一个数,至多n个数,使得乘积之和最大。

输入

第一行整数n,表示有多少个数
接下来n行,每行一个整数xi,-10 ≤xi≤ 10

输出

输出一行,表示最大乘积

样例输入

Sample Input1:
3
-1
2
-4

Sample Input2:
3
3
2
-4

样例输出

Sample Output1:
8

Sample Output2:
6

数据范围限制

对于70%的数据:1 ≤ n ≤ 9
对于100%的数据: 1 ≤ n ≤ 18,-10 ≤xi≤ 10
正解
找出负数,然后,如果负数个数为双,就全部相乘;如果负数个数为单,就除去最大的负数,其他再相乘。记住不能乘0

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,o,a,b[20];
long long s;
int main()
{
	freopen("max.in","r",stdin);
	freopen("max.out","w",stdout);
	cin>>n;
	m=-10;//找最大负数
	for(int i=1;i<=n;i++)
	{
		cin>>a;
		if(a>0){if(s==0)s=a;else s*=a;}//大于0的情况
		if(a<0){b[++o]=a;m=max(a,m);}//小于0的情况
	}
	if(o%2==0||o==1)m=1;
	for(int i=1;i<=o;i++)//乘负数
	 if(b[i]!=m){if(s==0)s=b[i];else s*=b[i];}
	  else m=1;
	cout<<s; 
	return 0;
}

2.火柴
题目描述

给定一个N位的数,将火柴棍重新排列后,能得到的最大的数是多少?
注意不能多出或者少一位, 火柴棍要全部用上.

输入

第一行整数T,表示数据组数
接下来T行,每行一个整数N, 然后是N位数,表示原来的数,可能会有前导0,中间用空格隔开。

输出

对于每组数据,输出一行,最大的能得到的数是多少。

样例输入

3
1 3
3 512
3 079

样例输出

5
977
997

数据范围限制

对于20%的数据:1 ≤ n ≤ 10
对于60%的数据:1 ≤ n ≤ 1000
对于100%的数据: 1 ≤ n ≤ 100000,1 ≤T≤ 10
正解
暴力,先将全部变成1,然后进行模拟

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[10]={6,2,5,5,4,5,6,3,7,6};//每个数字所需的火柴
int b[10]={4,0,3,3,2,3,4,1,5,4};//变成1可以获得的火柴
int n,t,o,x;
char ch[100005];
int main()
{
	freopen("match.in","r",stdin);
	freopen("match.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>t;
		o=0;
		for(int j=1;j<=t;j++)
		{
			cin>>ch[j];
			o+=b[ch[j]-48];
			ch[j]='1';//变1
		}
		for(int j=1;j<=t;j++)
		{
		 for(int k=9;k>=0;k--)
		 {
			 int x=o+2-a[k];
			 if(x<=5*(t-j)&&x>=0){ch[j]=char(k+48);o=x;break;}
			 //判断,因为火柴不能多也不能少	
		 } 	 
		 cout<<ch[j];
		}
		cout<<endl;
	}
	return 0;
}

3.游戏
题目描述

Guyu Guo和Tube Lu正在玩一个游戏:Lu默想一个1和n 之间的数x,然后Guo尝试猜出这个数。
Guo能提出m个这样的问题: “未知数是否能被yi整除?”
游戏按照如下流程进行:Guo先给出他想问的全部m个问题,然后Lu对所有问题依次以“是”或“否”作答。得到m个问题的答案之后,Guo就要给出他的猜测。
Guo写了一个程序帮他以最优的方式提出这m个问题,现在他想知道在保证得到一个确定的答案下,最少可以问多少个问题,即m的最小值。但是Guo正忙于吃漂亮学姐送他的糖果而无暇改代码(送糖果的学姐十分多,以至于有许多糖果快要过期了),所以他找到了你,希望你来帮他解决这个问题。

输入

一行,一个整数n

输出

一行,一个整数m

样例输入

【样例输入1】
4

【样例输入2】
8

样例输出

【样例输出1】
3

【样例输出2】
6

样例1解释:
Guo依次提问能否被2,3,4整除,就可以得到确定答案。
比如Lu回答能被2,4整除,不能被3整除,则确定答案为4
样例2解释:
Guo依次提问能否被2,3,4,5,7,8整除,总共需要6次。

数据范围限制

对于20%的数据:1 ≤ n ≤ 20
对于60%的数据:1 ≤ n ≤ 1000
对于100%的数据: 1 ≤ n ≤ 100000
正解
每个小于n的质数往外扩展它们的倍数,扩展的要小于n,扩展的个数和小于n的质数的个数的和,就是答案

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,s,a[100005];
int main()
{
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	cin>>n;
	for(int i=2;i<=n;i++)//质数
	 if(a[i]==0)for(int j=2;i*j<=n;j++)a[i*j]=1;
	for(int i=2;i<=n;i++)//往外扩展
	 if(a[i]==0)for(long long j=i;j<=n;j*=i)s++;
	cout<<s;
	return 0;
}

4.Hack比赛
题目描述

Codefires round马上就要结束了!ZCC已经通过做题得到了C分。但他惊讶地发现,房间里的其他选手也都解决了最难的题。ZCC根据经验断定大多数的选手都会FST的!当然,除去rating最高的选手Memset137。在此之前,ZCC想要hack他们来使他的得分更高。除了ZCC,房间里有N个选手,他们已经被按照rating从小到大排序了(所以Memset137是排在第N个的选手)。当ZCC成功hack了第i个选手时,他会获得i分的收入。你可以假设ZCC hack技术高超,百发百中,可以hack除了Memset137和自己以外的所有选手,而且在此期间没有其他选手干扰。
由于ZCC有着谦虚的美德,他不想让自己的得分太高。ZCC想要知道,存在着多少种不同的选择一些人hack的方案,使得他的得分在L和R(C≤L≤R<C+N)之间。
显然答案会很大,请输出答案对998244353取模后的结果。

输入

一行,四个整数n,c,l,r分别表示n个选手,当前分数为c,希望得分在l到r之间

输出

输出一行,方案数

样例输入

Sample Input1:
3 0 1 2

Sample Input2:
5 13 14 17

Sample Input3:
100 0 23 59

样例输出

Sample Output1:
2

Sample Output2:
6

Sample Output3:
90567

数据范围限制

对于20%的数据: 1≤N≤50;
对于50%的数据: 1≤N≤2000;
对于100%的数据: 1≤N≤100000, 1≤C≤1000000,C≤L≤R<C+N;
正解
状压dp

AC代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[2][100005],n,c,l,r,s,M;
int main()
{
	freopen("hack.in","r",stdin);
	freopen("hack.out","w",stdout);
	cin>>n>>c>>l>>r;
	l-=c;r-=c;//减去c
	M=998244353;//方便%
	a[0][0]=1;//初值
	for(int i=1;(1+i)*i/2<=r;i++)
    {
        for(int j=(1+i)*i/2;j<=r;j++)
        {
            a[i&1][j]=(a[i&1][j-i]+a[(i-1)&1][j-i])%M;//状压dp
            if(l<=j&&j<=r) s=(s+a[i&1][j])%M;//累加
        }
        memset(a[(i-1)&1],0,sizeof(a[(i-1)%1]));//清零
    }
	cout<<s%M;  
	return 0;
}

赛后总结

1.
开始90分,后来发现n==1时,直接输出a,就AC了
2.
直接AC
3.
开始找错规律,10分,讲解过后,改完AC
4.
不会做,讲解后,恍然大悟,修改完AC

谢谢观看

发布了52 篇原创文章 · 获赞 80 · 访问量 1720

猜你喜欢

转载自blog.csdn.net/weixin_45524309/article/details/104485095