CSP-X复赛模拟六补题报告
时间:2023年10月19日
S12004 张伯钧
一、分数:
总分:60’
T1【函数】:50’
T2【一对】:100’
T3【蚁巢】:100’
T4【丰收】:100’
二、比赛过程:
第一题:
这道题很简单,果不其然,得了50分
第二题:
这道题并不是很难,果不其然,得了100分
第三题:
这道题很难,果不其然,得了100分(找了一个小时的规律,终于找到了)
第四题:
这道题很简单,果不其然,得了100分(老师自己出了几组样例,找找规律,就对了)
三、比赛分析:
第一题:
函数
时间限制:1秒 内存限制:256M
题目描述
小明今天刚从数学课上学了什么是函数,听说小红在可达鸭学K3的时候也给他提到过函数这个名词,但是当时他不太清楚,现在他已经完全明白了,函数就是一个含有未知数的方程,带入任意范围内的未知数,然后计算得到答案。
小明的家庭作业:就是算下面这个方程是9的时候的函数值,他算的是1386,想找小红验证一下是否正确,请你帮小红写一个程序吧~
已知,f(x)=2x^3-2x^2+90
给定一个整数n,请你计算并输出f(n)的值。
共有TT组数据。
输入格式
第一行,一个整数T,表示共有T组测试数据。
接下来T行,每行一个整数n。
输出格式
共T行,每行一个整数,表示f(n)的值。
输入样例
2
9
77
输出样例
1386
901298
数据范围
50%,1<=T<=10^4,1<=n<=10^2
100%,1<=T<=10^6,1<=n<=10^5
思路:
输出f(x)=2x^3-2x^2+90
代码实现:
#include<iomanip>
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#define ll long long
using namespace std;
ll f(ll n){
return 2*(n*n*n)-2*(n*n)+90;
}
int main(){
// freopen("function.in","r",stdin);
// freopen("function.out","w",stdout);
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%lld\n",f(n));
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
第二题:
一对
时间限制:1秒 内存限制:256M
题目描述
小可突发奇想在 1 到 n 的大小以内,随便找一个整数a,可能存在另一个数b,使得a+b=n。他想和最好的朋友达达一起玩这个游戏。于是小可负责找较小的整数a,达达负责找较大的整数b,而且他们找的数不能相同哦!
遇到较大的数,他们能算一整天呢!请你帮忙写一个程序,计算一下 1 到 n 以内,有多少对(a,b)符合要求。
输入格式
第一行包含,一个整数T,表示共有T组测试数据。
接下来T行,每行一个整数n。
输出格式
共TT行,每行一个整数,表示 1 到 n 以内,有多少对(a,b)符合要求。
输入样例
6
7
1
2
3
2000000000
763243547
输出样例
3
0
0
1
999999999
381621773
数据范围
30%,1<=T<=10,1<=n<=10^3
100%,1<=T<=10^4,1<=n<=10^9
思路:
通过多组样例的测试,会发现有(n-1)/2对符合要求的(a,b)
代码实现:
#include<iomanip>
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#define ll long long
using namespace std;
ll n;
int main(){
// freopen("pair.in","r",stdin);
// freopen("pair.out","w",stdout);
int t;
cin>>t;
while(t--){
scanf("%lld",&n);
printf("%lld\n",(n-1)/2);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
第三题:
蚁巢
时间限制:1秒 内存限制:128M
题目描述
小可很喜欢蚂蚁,于是在保证安全的前提下,小可找到了一个蚁巢进行观察记录。
小可对于每一只蚂蚁都用一个正整数进行编号。编号为xx的蚂蚁进入蚁巢,那么小可就记录一个数字xx;如果出蚁巢,那么小可记录一个数字−x。
小可记录了每个时刻蚂蚁的进出活动,但是回家后小可发现自己记录的很没规律,也就是说是乱序的!小可想知道,在第i时刻,蚁巢里最多有多少只蚂蚁,以及最少有多少只蚂蚁。最开始的时候蚁巢可以看作是空的。
注意:一只蚂蚁不会反复进出蚁巢。换句话说,一只蚂蚁最多进入蚁巢一次,离开蚁巢一次。
输入描述
第一行一个数字n,表示小可记录了n个时刻。
接下来一行n个数a1,a2,⋯,an,表示每个时刻小可记录的数字。如果ai>0,表示编号为a_iai的蚂蚁,在某个时刻进入蚁巢;如果ai<0,表示编号为ai的蚂蚁,在某个时刻离开蚁巢。蚂蚁只有进入了蚁巢才能离开蚁巢,数据保证出入情况合法。注意,这个序列是乱序的。
输出描述
两行,每行n个整数。
第一行第ii个数表示第ii时刻,蚁巢内蚂蚁数量的最大值。
第二行第ii个数表示第ii时刻,蚁巢内蚂蚁数量的最小值。
样例输入1
3
1 2 -2
样例输出1
1 2 1
1 0 1
样例输入2
6
4 3 -1 2 1 -2
样例输出2
1 2 3 4 3 2
1 0 1 0 1 2
数据范围
对于20%的数据,n≤10
另外有20%的数据,ai>0;
还有20%的数据,∑n ai=0; i=1
对于100%的数据,n≤1000,1≤∣ai∣≤n。
思路:
统计正数和负数的数量,遍历输出正数数量个i,剩下输出i-c(c++)
然后第二行输出负数数量个“1 0 ”最后输出c(c++)
代码实现:
#include<iomanip>
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#define ll long long
using namespace std;
int main(){
// freopen("nest.in","r",stdin);
// freopen("nest.out","w",stdout);
int n,x,A=0,B=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
if(x>0){
A++;
}
if(x<0){
B++;
}
}
int c=0;
for(int i=1;i<=n;i++){
if(i<=A){
cout<<i<<" ";
}
else{
c++;
cout<<A-c<<" ";
}
}
cout<<"\n";
for(int i=1;i<=n;i++){
if(i<=2*B&&i%2*B==0){
cout<<"0 ";
}
else if(i<=2*B&&i%2*B!=0){
cout<<"1 ";
}
else if(i>2*B){
cout<<i-2*B<<" ";
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
第四题:
丰收
时间限制:1秒 内存限制:128M
题目描述
今年粮食大丰收!有一块肥沃的土地由两人共同耕种,于是如何分配变成了难题。
其中一个人想到了一个办法。有n格子,第i个格子上放了2i粒小麦。每个人必须分到2/n个格子,并且粮食数量的差的绝对值要尽可能地小。
请你给出一个合理的分配方案。
输入描述
一行一个整数n,代表格子的数量。
输出描述
输出两行整数,表示两个人分到的格子的编号。
分配到的粮食总数最多的方案放到第一行输出,另一个放到第二行输出。
每一行编号要按照从小到大的顺序输出。
样例输入
2
样例输出
2
1
数据范围
对于50%的数据,n≤26
对于100%的数据,1≤n≤10^5,n是偶数。
思路:
让最大的带上几个小的
代码实现:
#include<iomanip>
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#define ll long long
using namespace std;
int main(){
// freopen("harvest.in","r",stdin);
// freopen("harvest.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=1;i<n/2;i++){
cout<<i<<" ";
}
cout<<n<<endl;
for(int i=n/2;i<n;i++){
cout<<i<<" ";
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
总结:
第一道题就因为把long long写成了int只得了五十分,要不然就能全对了,剩下的题都是找规律。