csp刷题第一周
Posted William_Tao(攻城狮)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csp刷题第一周相关的知识,希望对你有一定的参考价值。
文章目录
csp刷题
第一题(数组推导)
202109-1 | 数组推导 |
---|---|
http://118.190.20.162/view.page?gpid=T129 |
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
long long n;
long long sum_min=0,sum_max=0;
cin>>n;
long long B[n];
for(long long i=0;i<n;i++)
cin>>B[i];
sum_max+=B[i];
for(long long i=1;i<n;i++)
if(B[i]>B[i-1])
sum_min+=B[i];
cout<<sum_max<<endl;
cout<<sum_min+B[0]<<endl;
return 0;
第二题(灰度直方图)
202104-1 | 灰度直方图 |
---|---|
http://118.190.20.162/view.page?gpid=T128 |
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
int n,m,L;
cin>>n>>m>>L;
int num=n*m;
vector<int> res(L);
for(int i=0;i<num;i++)
int data;
cin>>data;
res[data]++;
for(int i=0;i<L-1;i++)
cout<<res[i]<<" ";
cout<<res[L-1]<<endl;
return 0;
★第三题(邻域均值)
202104-2 | 邻域均值 |
---|---|
http://118.190.20.162/view.page?gpid=T127 |
参考博客:
https://blog.csdn.net/weixin_47946614/article/details/117392544?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164465892116781685343265%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164465892116781685343265&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-1-117392544.first_rank_v2_pc_rank_v29&utm_term=%E9%82%BB%E5%9F%9F%E5%9D%87%E5%80%BCC%2B%2B&spm=1018.2226.3001.4187
#include<bits/stdc++.h>
using namespace std;
int n,l,r,t,A[601][601],s[601][601];
void solve()
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)//将邻域转化为矩阵的形式 (i_min,j_min) (i_max,j_max)为这一位置邻域矩阵的边界
double cal=0;
int i_max=min(n,i+r);
int i_min=max(1,i-r)-1;
int j_max=min(n,j+r);
int j_min=max(1,j-r)-1;
double sum=s[i_max][j_max]-s[i_max][j_min]-s[i_min][j_max]+s[i_min][j_min];
int num=(i_max-i_min)*(j_max-j_min);//矩阵中元素数量
cal=(double)sum/(double)num;//平均值一定要保留小数
if(cal<=t) ans++;
cout<<ans<<endl;
int main()
ios::sync_with_stdio(false);
cin>>n>>l>>r>>t;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>A[i][j];
for(int i=1;i<=n;i++)//构造前缀和数组
for(int j=1;j<=n;j++)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+A[i][j];
solve();
system("pause");
return 0;
第四题(称检测点查询)
202009-1 | 称检测点查询 |
---|---|
http://118.190.20.162/view.page?gpid=T113 |
思路:
- 定义一个结构体,存放编号和距离
- 通过重写排序方法,即若距离相同,编号小的优先,否则距离短的优先
- 通过sort函数对vector进行排序,然后输出前三个元素的编号即可
#include<bits/stdc++.h>
using namespace std;
struct point
int id;
double sum;
;
bool cmp(point a,point b)
if(a.sum==b.sum)
return a.id<b.id;
else
return a.sum<b.sum;
int main()
int n,X,Y;
cin>>n>>X>>Y;
vector<point> res(n);
//输入
for(int i=0;i<n;i++)
int x,y;
cin>>x>>y;
res[i].id=i+1;
res[i].sum=pow(x-X,2)+pow(y-Y,2);
//排序
sort(res.begin(),res.end(),cmp);
//输出
for(int i=0;i<3;i++)
cout<<res[i].id<<endl;
return 0;
第五题(分蛋糕)
201703-1 | 分蛋糕 |
---|---|
http://118.190.20.162/view.page?gpid=T57 |
思路:
1、计算有几人分到了蛋糕,即维护一个变量weight,weight表示正在被分配蛋糕的朋友手中蛋糕的重量。
2、将输入的数据依次加到weight上,当weight >= k时,表示朋友A的蛋糕已经分配完成,此时分到蛋糕的人数加1,然后为下一个朋友B分配蛋糕,此时朋友B还没有蛋糕,所以将weight置为0,然后从剩下的蛋糕中编号最小的开始为朋友B分蛋糕。
3、如果蛋糕已经分配完成,但此时weight不为0,说明有一位朋友C在最后分到了蛋糕,但他有点黑,分到的蛋糕重量小于k,但他依然得到了蛋糕,所以最后人数还要加1。
4、输出人数。
/*
20190817
ccf试题1:分蛋糕
*/
#include <iostream>
using namespace std;
int main()
//接收输入数据
int n, k;
cin >>n;
cin >>k;
int arr[n];
for(int i=0; i<n; i++)
cin >>arr[i];
//计算人数
int index = 0;
int weight = 0;
for(int i=0; i<n; i++)
weight += arr[i];
if(weight >= k)
index++;
weight = 0;
if(weight != 0)
index += 1;
//输出结果
cout <<index<<endl;
return 0;
第六题(小中大)
201703-1 | 分蛋糕 |
---|---|
http://118.190.20.162/view.page?gpid=T89 |
80分解法:
#include<bits/stdc++.h>
using namespace std;
int main()
int n,k;
cin>>n;
vector<int> res(n);
for(int i=0;i<n;i++)
cin>>res[i];
sort(res.begin(),res.end());
int mid=0;
if(n%2==0)
mid = (res[n/2]+res[n/2-1])/2;
else
mid = res[n/2];
cout<<res[n-1]<<" "<<mid<<" "<<res[0];
return 0;
100分解法:
#include<bits/stdc++.h>
using namespace std;
int main()
int n;
float mid;
int mid1,mid2,max,min;
int temp;
cin>>n;
cin>>temp;
mid1=mid2=max=min=temp;
//找到 中位数可能的取值 若n为奇数 mid1和mid2 指向同一个位置, 若为偶数,则指向中间的两个
for(int i=2;i<=n;i++)
cin>>temp;
if(i == ((n+1)/2))
mid1=temp;
if(i == (n/2)+1)
mid2=temp;
if(temp>max)
max = temp;
if(temp<min)
min = temp;
// cout<<"mid1:"<<mid1<<"mid2:"<<mid2<<endl;
//真正意义上的mid
mid = (mid1 + mid2)/2.0;
temp = mid;
// cout<<"mid:"<<mid<<"temp:"<<temp<<endl;
if(temp !=mid) //浮点转换为整形代表需要四舍五入
temp = (mid + 0.05)*10;
mid = temp/10.0;
cout<<max<<' '<<mid<<' '<<min<<' ';
else
cout<<max<<' '<<temp<<' '<<min<<' ';
return 0;
第七题(中间数)
201612-1 | 中间数 |
---|---|
http://118.190.20.162/view.page?gpid=T52 |
思路
- 先对数组进行排序
- 那么,排序后数组一定有序,那么肯定是要从中间才有可能是左边的个数和右边的个数相等情况才会出现
如一下两种排序情况
2 3 4 5 6
2 3 4 5
#include<bits/stdc++.h>
using namespace std;
int main()
int n;
cin>>n;
vector<int> res(n);
for(int i=0;i<n;i++)
cin>>res[i];
sort(res.begin(),res.end());
int temp = n/2;
int countleft=0,countright=0;
for(int i=0;i<n;i++)
if(res[i]<res[temp])
countleft++;
if(res[i]>res[temp])
countright++;
if(countleft==countright)
cout<< res[temp];
else
cout<<-1;
//2 3 5 5 6 6
return 0;
第八题(数位之和)
201512-1 | 数位之和 |
---|---|
http://118.190.20.162/view.page?gpid=T37 |
思路:
使用string类型来存储
#include<bits/stdc++.h>
using namespace std;
int main()
string str;
cin>>str;
int sum=0;
for(int i=0;i<str.size();i++)
sum+=str[i]-'0';
cout<<sum;
return 0;
第九题(图像旋转)
201503-1 | 图像旋转 |
---|---|
http://118.190.20.162/view.page?gpid=T27 |
思路
1 5 3
3 2 4
变为:
3 4
5 2
1 3实则,是将第三列 变为第一行, 第二列变为第二行, 第一列变为第三行
#include<bits/stdc++.h>
using namespace std;
int main()
int n,m;
cin>>n>>m;
int arr[n][m]=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>arr[i][j];
for(int j=m-1;j>=0;j--)
for(int i=0;i<n;i++)
cout<<arr[i][j]<<" ";
cout<<endl;
return 0;
第十题
201912-1 | 报数 |
---|---|
http://118.190.20.162/submitlist.page?gpid=T100 |
思路:
定义一个数组,用于存放报数含有7或整除的
通过for循环来进行报数
通过COUNT用于记录是否达到报数的n
注意:最后i%4 用于代表下标是甲乙丙丁的哪一位(因为是除以4,如果i%4==0,则代表丁,所以最后输出要做个处理)
#include<bits/stdc++.h>
using namespace std;
bool isContainSeven(int x)
if(x%7==0)return true;
else
int remain = 0, b = 0;
while (x)
remain = x % 10;
if (remain == 7)
return true;
x = x / 10;
return false;
int main()
int n,m;
cin>>n;
int COUNT=0;
int arr[4]=0;
for(int i=1;;i++)
if(COUNT==n)break;
if(isContainSeven(i))
arr[i%4]++;
else
COUNT++;
// cout<<i<<" --"<<COUNT<<endl;
for(int i=1;i<4;i++)
cout<<arr[i]<<endl;
cout<<arr[0]<<endl;
return 0;
以上是关于csp刷题第一周的主要内容,如果未能解决你的问题,请参考以下文章