20240414
A-勾股数
枚举a和b即可计算c。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, ans = 0;
cin >> n;
for (int a = 1; a <= n; ++a)
for (int b = a; b <= n; ++b)
{
int c = sqrt(a * a + b * b);
if (c > n || c * c != a * a + b * b) continue;
/*开方后若不是整数会向下取整,所以可能c*c!=a*a + b*b */
++ans;
}
cout << ans;
return 0;
}
B-圣诞树
找规律,前n-1层每层有 2*i 根绳子,等差数列求和可得共有n*(n-1)根,最后一层有(n-1)根绳子,故共有(n+1)*(n-1)根。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<(n+1)*(n-1);
return 0;
}
C-k小整数
题解见注释。
#include <bits/stdc++.h>
using namespace std;
int n,k,b[30010],gs,a;
int main()
{
cin>>n>>k;//输入n和k
for(int i=1; i<=n; i++)
{
cin>>a;
b[a]++;//用数组计数的方法把数存进去
}
for(int i=1; i<=30000; i++)
{
if(b[i]>=1) gs++;//由于相同的数存在一个数组里,所以不用去重
if(gs==k)
{
cout<<i; //找出第k小,输出
return 0;
}
}
cout<<"NO RESULT";//否则找不出第k小
return 0;
}
D-统计出现次数
可以使用排序的方法,也可以用map解决。
排序方法代码如下,题解见注释。
#include<bits/stdc++.h>
using namespace std;
int n,ans=1;//n是共有多少个数,ans记录每个数出现的次数
int a[200005];
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);//排序函数,默认从小到大排序
for(int i=2; i<=n; i++)
{
if(a[i]==a[i-1])ans++;
else
{
cout<<a[i-1]<<' '<<ans<<endl;
ans=1;//初始化ans
}
}
cout<<a[n]<<' '<<ans<<endl;//没输出完
return 0;
}
E-山峰
根据题意模拟即可。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1010][1010];
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>a[i][j];
}
}
int t;
cin>>t;
while(t--)
{
int x,y,xx,yy;
cin>>x>>y>>xx>>yy;
swap(a[x][y],a[xx][yy]);
}
int ans=0;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(a[i][j]>a[i-1][j]&&a[i][j]>a[i][j-1]&&a[i][j]>a[i+1][j]&&a[i][j]>a[i][j+1])
{
ans++;
}
}
}
cout<<ans<<endl;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(a[i][j]>a[i-1][j]&&a[i][j]>a[i][j-1]&&a[i][j]>a[i+1][j]&&a[i][j]>a[i][j+1])
{
cout<<i<<' '<<j<<endl;
}
}
}
return 0;
}