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

思路:

  1. 定义一个结构体,存放编号和距离
  2. 通过重写排序方法,即若距离相同,编号小的优先,否则距离短的优先
  3. 通过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刷题第一周的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题第一周

Pat刷题第一周

C语言百日刷题第二天

LeetCode算法题--刷题第一天

(基础杂记) —— 2021-07-13 —— 牛客刷题错题记录

(基础杂记) —— 2021-07-13 —— 牛客刷题错题记录