1.12UPC新生赛21场

A统计方格

签到题,定义几个变量,输入的时候顺带统计一下即可

#include<iostream>

using namespace std;

int n,m;
int ans,Max=0,MAx,Min=101,MIn;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int sum=0;
		for(int j=1;j<=m;j++)
		{
			bool a;
			cin>>a;
			if(!a)sum++;
		}
		ans+=sum;
		if(Max<sum)
		{
			Max=sum;
			MAx=i;
		}
		if(Min>sum)
		{
			Min=sum;
			MIn=i;
		}
	}
	cout<<ans<<' '<<MAx<<' '<<MIn;
	return 0;
}

B转圈游戏II

这个题对时间的要求很高,一直TLE。。最后想起前段时间看到的GTA5那屎山一样的if代码。。于是我也把if都换掉了,没想到过了
emmm,一开始就没打算用数组,直接统计首位的位移,最后直接依次输出+1即可

#include<iostream>
#include<cmath>
#include<cctype>
#pragma GCC optimize(2)//O2优化
using namespace std;

int n,q;
int head=0;
void qin(int &x)//快速读入,实际在这题没啥卵用
{
	x=0;
	char c=0;
	while(!isdigit(c))c=getchar();
	while(isdigit(c))x=x*10+c-'0',c=getchar();
}
int main()
{
	qin(n);
	qin(q);
	for(int i=1;i<=q;i++)
	{
		int a,b;
		qin(a);
		qin(b);
		head=head+(3-a*2)*b;//这里就是第一个去掉if,输入的是1,2怎么转换成1和-1
		//if代码
		//if(a==1)head+=b;
        //else head-=b;
	}
	int start=(n+head%n)%n;//这里适配25行的代码,也是去掉if后的写法
	//if代码
	//if(head>=0)start=head;
	//else start=n+head%n;
	for(int i=0;i<n;i++)
		printf("%d\n",(start+i)%n);
	return 0;
}

C排队III

原先想直接sort一下,发现不能同等长度的保留原有的输入顺序,自己手写的快排也一样。
干脆,排也不排序了,直接统计最长的长度,从头遍历,长度符合就输出计数,输出数量不够就从头循环,每次长度--,直到长度=0或计数=n

#include<iostream>
#include<algorithm>

using namespace std;
string a[15001];
int len=0;
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		if(len<a[i].length())len=a[i].length();
	}
	int i=0;
	while(i<=n)
	{
		for(int j=0;j<n;j++)
		{
			if(a[j].length()==len)
			{
				cout<<a[j]<<endl;
				i++;
			}
			if(i==n)break;
		}
		len--;
		if(len==0)break;
	}
	return 0;
}

D寻找子矩阵

这个和之前那个激光炸弹差不多,都是前缀和,这里只要把偶数列输入的时候变成负的即可

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

int n,m,p,q;
int Map[1001][1001];
int Ss[1001][1001];
int maxx=0;
int main()
{
	
	cin>>n>>m>>p>>q;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			int x;
			cin>>x;
			if(j%2)
				Map[i][j]=x;
			else
				Map[i][j]=x*(-1);
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			Ss[i][j]=Map[i][j]+Ss[i-1][j]+Ss[i][j-1]-Ss[i-1][j-1];
		}
	}
	for(int i=p;i<=n;i++)
	{
		for(int j=q;j<=m;j++)
		{
			maxx=max(maxx,abs(Ss[i][j]-Ss[i-p][j]-Ss[i][j-q]+Ss[i-p][j-q]));
		}
	}
	cout<<maxx;
	return 0;
}

E字母统计

水题,getline,再遍历一遍统计解决

#include<iostream>
using namespace std;
int a=0;
string k;
int main()
{
	getline(cin,k);
	for(int i=0;i<k.length();i++)
	if(k[i]=='b'||k[i]=='B'||k[i]=='m'||k[i]=='M')
	a++;
	cout<<a;
	return 0;
}

F魔法袋子

同样的水题,判断每个输入的是否大于半径,统计下即可。没想到简单的似乎在后面

#include<iostream>
using namespace std;
int n,r;
int ans;
int main()
{
	cin>>n>>r;
	for(int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		if(x<=r)ans++;
	}
	cout<<ans;
	return 0;
}

G完全数

用循环取余求一下真约数,加起来判断一下,然后输出的时候直接格式化输出%X即可

#include<iostream>

using namespace std;
bool check(int a)
{
	int ans=0;
	for(int i=1;i<a;i++)
	{
		if(a%i==0)ans+=i;
	}
	if(a==ans)return 1;
	else return 0;
}
void print(int n)//这就有些多余了
{
	printf("%X",n);
	cout<<' ';
}
bool s=1;
int main()
{
	int x,y;
	cin>>x>>y;
	for(int i=x;i<=y;i++)
	{
		if(check(i))
		{
			s=0;
			print(i);
		}
	}
	if(s)cout<<"no";
	return 0;
}

H学生代表

输入一排,sort一次,将中间的数存入一个数组
最后sort该数组,输出中间的数

#include<iostream>
#include<algorithm>

using namespace std;

int a[100];
int b[100];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		cin>>a[j];
		sort(a,a+n);
		b[i]=a[n/2];
	}
	sort(b,b+n);
	cout<<b[n/2];
	return 0;
}

I拯救花园

这个需要求一下每只兔子单位时间破坏能力,排序,先抓单位时间破坏最大的兔子

#include<iostream>
#include<algorithm>

using namespace std;

struct rabbit
{
	double h;
	double t;
}a[101];
bool cmp(rabbit a,rabbit b)
{
	return a.h/a.t>b.h/b.t;
}
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i].t>>a[i].h;
	sort(a,a+n,cmp);
	int ans=0;
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<n;j++)
		ans+=a[j].h*a[i].t;
	}
	cout<<ans*2;
	return 0;
}

J投票

也是挺简单的一道题目,先按组数排序,取前一半人数少的,然后人数取一半+1,累加即可

#include<iostream>
#include<algorithm>

using namespace std;
int k;
int a[1010]; 
int main()
{
	cin>>k;
	for(int i=0;i<k;i++)
		cin>>a[i];
	sort(a,a+k);
	int ans=0;
	for(int i=0;i<=k/2;i++)
	{
		ans+=(a[i]/2+1);
	}
	cout<<ans;
	return 0;
}
posted @ 2022-01-13 09:05  qbning  阅读(31)  评论(0编辑  收藏  举报
描述