【2020.10.14普及组】SSL模拟赛题解

目录:

T1:小X的加法难题
T2:小X的密码破译
T3:小X的液体混合
T4:小X的AK计划

T1:小X的加法难题

第一节编程课上,老师要求大家写一个程序计算两个正整数的和。
看到小 X 不屑的眼神后,老师决定给小 X 增加难度。以求 12 和 3 的和为例,老师在 12 + 3 这个原始式子里加入一些无用的空格,再把它交给小 X。
这下小 X 傻眼了,希望你帮帮他。

Input

第一行包含一个字符串,表示老师给小 X 的式子。

Output

若式子的结果不超过 108,则第一行包含一个整数,表示式子的结果;否则第一行包含一个字符串
“Large”。

Example

1 2 + 3
15
23456789+98765432 
Large

分析:

过一遍字符串,以加号为分界。
专为数字加起来,判断是否超过108

上代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int L=100000000;
char a;
long long sum,ff,st,nd,ans,lo1,lo2;

int main()
{
    
    
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	while(cin>>a)
	{
    
    
		if(a=='+') ff=1;
		if(ff==0&&a>='0'&&a<='9')
		{
    
    
			st=st*10+(a-48);
		}
		else if(ff==1&&a>='0'&&a<='9')
		{
    
    
			nd=nd*10+(a-48);

		}
	}
    ans=st+nd;
    if(ans>L) cout<<"Large";
    else cout<<ans;
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T2:小X的密码破译

这天小 Y 有事外出,小 X 又忘记带电脑了,于是想使用小 Y 的电脑。不幸的是,小 Y 设了密码,
密码提示是四个整数,且输错后密码和提示就会重新生成。
正当小 X 一筹莫展的时候,他打开小 Y 的抽屉,发现里面有一张小纸条,上面写着:“给出提示n, a, b, c,令 di = (ai2 + bi + c) mod 11111111(1 ≤ i ≤ n),将序列 d 去除重复的数后从小到大排序得到序列 e,设序列 e 有 m 个数,则密码为 (∑mi=1 iei) mod 11111111。”
小 X 十分激动,想立刻完成密码破译,希望你帮帮他。

Input

第一行包含四个整数 n, a, b, c。

Output

第一行包含一个整数,表示密码。

Example

3 0 0 2
2
5 1 2 3
380

分析

桶存储结果,直接按照题目说的顺序模拟计算然后出答案。

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int ff=11111111;
long long n,a,b,c,d[ff+1],ans,cnt=1;

int main()
{
    
    
	freopen("password.in","r",stdin);
	freopen("password.out","w",stdout);
	cin>>n>>a>>b>>c;
	for(int i=1;i<=n;i++)
	{
    
    
		int x=((a*i*i)%ff+(b*i)%ff+c%ff)%ff;
		d[x]=1;
	}
	for(int i=0;i<=ff-1;i++)
	{
    
    
		if(d[i]!=0)
		{
    
    
			ans=(ans+i*cnt%ff)%ff;
			cnt++;
		} 
	}
	cout<<ans;
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T3:小X的液体混合

虽然小 X 不喜欢化学原理,但他特别喜欢把一大堆液体倒在一起。
现在小 X 有 n 种液体,其中 m 对会发生反应。现在他想把这 n 种液体按某种顺序倒入一个容器内,让他获得最刺激的体验,也就是使危险系数尽量大。
我们可以这样计算危险系数,一开始容器内没有任何液体,危险系数为 1。每次液体倒入容器时,若容器内已有一种或多种液体会与这种液体发生反应,则危险系数会乘 2,否则危险系数不变。
最大危险系数小 X 不会算,希望你帮帮他。

Input

第一行包含两个整数 n, m。
接下来 m 行,每行包含两个整数 a, b,表示液体 a 和液体 b 会发生反应。

Output

第一行包含一个整数,表示最大危险系数。

Example

3 2
1 2
2 3
4

分析

这题明显要存每一对会发生反应的液体。
不难发现答案为2(k-1)。k为树的深度。
并查集找父节点 用高精计算答案

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int ans[325],fa[2025];
int sum,n,m,x,y;

int find(int dep)
{
    
    
	while(dep!=fa[dep]) 
	{
    
    
		dep=fa[dep];
	}
	return dep;
}

void solve()
{
    
    
	int x,y=0;
	for(int i=0;i<325;i++)
	{
    
    
		x=ans[i]*2+y;
		ans[i]=x%10;
		y=x/10;
	}
}

int main()
{
    
    
	freopen("mixture.in","r",stdin);
	freopen("mixture.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++) 
	{
    
    
		fa[i]=i;
	}
	for(int i=1;i<=m;i++)
	{
    
    
		cin>>x>>y;
		int xx=find(x),yy=find(y);
		fa[min(xx,yy)]=max(xx,yy);
	}
	ans[0]=1;
	for(int i=1;i<=n;i++)
	{
    
    
		if(fa[i]!=i)
		{
    
    
			solve();
		} 
	}
	int t=325;
	while(!ans[--t]);
	{
    
    
		t++;
	}
	while(t--)
	{
    
    
		printf("%d",ans[t]);
	}
	return 0;
}

T4:小X的AK计划

在小 X 的家乡,有机房一条街,街上有很多机房。每个机房里都有一万个人在切题。小 X 刚刷完CodeChef,准备出来逛逛。
机房一条街有 n 个机房,第 i 个机房的坐标为 xi,小 X 的家坐标为 0。小 X 在街上移动的速度为1,即从 x1 到 x2 所耗费的时间为 |x1 x2|。每个机房的学生数量不同,ACM 题目水平也良莠不齐。小 X 到达第 i 个机房后,可以花 ti 的时间想题,然后瞬间 AK;当然,也可以过机房而不入。
小 X 现在只有 m 个单位时间,之后他就该赶着去打 Codeforces 了。现在他想知道自己最多能在多少个机房 AK,希望你帮帮他。

Input

第一行包含两个整数 n, m。
接下来 n 行,每行包含两个整数 xi, ti。

Output

第一行包含一个整数,表示小 X 最多能 AK 的机房数量。

Example

2 10
1 100
5 5
1

分析

第一眼上去有点像动态规划
但是实际上不用,直接贪心就可以过。
但是要先排好序,让他不能回头。
每次按照距离时间来贪心。

上代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;

struct node
{
    
    
    ll x,y;
}a[100001];

ll n,m,f[100001],x,y,b[100001],ans,t;

bool cmp(node x,node y)
{
    
    
    return x.x<y.x;
}

int main()
{
    
    
	freopen("plan.in","r",stdin);
	freopen("plan.out","w",stdout);
	cin>>n>>m; 
	for(ll i=1;i<=n;i++) 
	{
    
    
		cin>>a[i].x>>a[i].y;
	}	
	sort(a+1,a+n+1,cmp);
	for(ll i=1;i<=n;i++)
	{
    
    
		if(t+a[i].y<=m-a[i].x)
		{
    
    
			t+=b[++ans]=a[i].y;
		}
		else if(a[i].y<b[ans])
		{
    
    
			t-=b[ans]-a[i].y;
			b[ans]=a[i].y;
		}
	}
	cout<<ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/109321355
今日推荐