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;
}
作者:qbning
-------------------------------------------
个性签名:曾经的我们空有一颗望海的心,却从没为前往大海做过真正的努力
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!