第一届河北工业大学程序设计竞赛校赛 个别题的解析

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一届河北工业大学程序设计竞赛校赛 个别题的解析相关的知识,希望对你有一定的参考价值。

水平有限,把会做的题做了一些总结。

A: WELCOME!

在这里插入图片描述
题目地址

#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<set>
using namespace std;
int main(void)
{
	cout<<"Welcome to The First Programming Competition of Hebei University of technology!"<<endl;
 	return 0;
}  

B: POOLING

在这里插入图片描述
题目地址

这道题挺水的,但是做的时候题目有点没理解全,导致以为输出的一定是个正方形,WA了好几次。
当时的方法过了几天再看一下写的真是垃圾。
还得吐槽一下,题目是真的长,作为一个看到长题目就想放弃的人来说真的艰难。
以前就看到一道题,题目又长又看不懂当时放弃了,比赛完一看居然是一个巨水的题。直接当场吐血。

我的垃圾方法是: 把所有的左上角的坐标和右下角的坐标保存,再依次枚举求其每一个矩阵的最大值输出。
代码如下:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<set>
using namespace std;
int a[55][55];
struct node
{
    int startx,starty;
    int endx,endy;
}Node[3005];
int sum;
int main(void)
{
    int n,m,k; cin>>n>>m>>k;
    int temp=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>a[i][j];
        }
    }
    for(int i=0;i<n-k+1;i++)
    {
        for(int j=0;j<m-k+1;j++)
        {
            Node[temp].startx=i,Node[temp].starty=j;//保存左上角,右下角坐标
            Node[temp].endx=k+i-1,Node[temp].endy=k+j-1;
            temp++;
        }
    }
    cout<<n-k+1<<" "<<m-k+1<<endl;
    for(int i=0;i<temp;i++)//枚举所有的左上角和右下角,计算输出
    {
        int sum=0;
        for(int j=Node[i].startx;j<=Node[i].endx;j++)
        {
            for(int k=Node[i].starty;k<=Node[i].endy;k++)
            {
                sum=max(sum,a[j][k]);
            }
        }
        cout<<sum<<" ";
        if((i+1)%(m-k+1)==0) cout<<endl;
    }
    return 0;
}

简短代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=60;
int a[N][N];
int main(void)
{
	int n,m,k; cin>>n>>m>>k;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			cin>>a[i][j];
	cout<<n-k+1<<" "<<m-k+1<<endl;
	for(int j=0;j<n-k+1;j++)
	{
		for(int i=0;i<m-k+1;i++)
		{
			int temp=0;
			for(int w=j;w<j+k;w++)
			{
				for(int z=i;z<i+k;z++)
				{
					temp=max(temp,a[w][z]);
				}
			}
			cout<<temp<<" ";
		}
		cout<<endl;
	}
	return 0;
}

C: 标枪游戏

在这里插入图片描述
题目地址

原本用的二分结果莫名TLE,发现暴力居然可以过。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],n;
int main(void)
{
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	long long int sum=0;
	for(int i=1;i<=n;i++)
	{
		int cnt=0;
		for(int j=1;j<i;j++)
		{
			if(a[i]>=a[j]) cnt++;
		}
		if(i&1) sum+=1+cnt-(i-1-cnt);
		else sum=sum-(1+cnt-(i-1-cnt));
	}
	if(sum>0) cout<<"Calculus is hebei king!"<<endl;
	else if(sum==0)  cout<<"hebei shuang king!"<<endl;
	else cout<<"huaji is hebei king!"<<endl;
	return 0;
}

E: 简单数论

在这里插入图片描述
题目地址
官方题解:
在这里插入图片描述
其实本质就是一个k进制数, 表示的数就是 1-km-1

#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
typedef long long int LL;
int main(void)
{
	int t; cin>>t;
	while(t--)
	{
		LL k,m,p; cin>>k>>m>>p;
		LL res=1;
		for(int i=1;i<=m;i++) res=res*k;
		cout<<--res<<endl;
		if(res<p) cout<<"overflow"<<endl;
		else
		{
			res=res-p+1;
			vector<int> ans;
			for(int i=1;i<=m;i++) ans.push_back(res%k),res/=k;
			for(int i=ans.size()-1;i>=0;i--) cout<<ans[i]<<" ";
			cout<<endl;
		}
	}
}

F: 回文串

在这里插入图片描述
题目地址

如果都是偶数的话,那么就是1组。
如果是奇数的话,就是奇数的个数,因为偶数的字符都可以组成一组,把1个奇数的字符插入进那个偶数的字符。
剩下的 n-1 个奇数字符还是 每个人一个组 n-1+1(偶数组)=n 即答案就是奇数字符的个数

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[30];
int main(void)
{
	string s; cin>>s;
	for(int i=0;i<s.size();i++) a[s[i]-'a']++;
	int s1=0,s2=0;
	for(int i=0;i<=25;i++)
	{
		if(a[i]&1) s1++;
		if(a[i]%2==0&&a[i]) s2++;
	}
	if(s1) cout<<s1<<endl;
	else cout<<1<<endl;
	return 0;
}

J: 有点复杂的gcd问题

在这里插入图片描述
题目地址

官方题解:
在这里插入图片描述
一道唬人的大水题。

#include<cstdio>
#include<iostream>
using namespace std;
const int mod=1e9+7;
int main(void)
{
    long long int n,k; cin>>n>>k;
    cout<<(n*(n+1)/2)%mod<<endl;
    return 0;
}

以上是关于第一届河北工业大学程序设计竞赛校赛 个别题的解析的主要内容,如果未能解决你的问题,请参考以下文章

南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 G

南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 H

第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem L. 跑图-题解

第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem H. 神殿-题解

第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem G. 520-题解

第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem K. Bitmap-题解