目录:
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;
}