D.守恒
题目:
解题思路:
对于所有的数组求总和后再算出平均数,由于约数不可能大于这个平均数,因此约数就在平均数中产生。同时如果这个约数也是sum的约数,那么显然可以。最后重点判断n=1的情况。
代码如下:(卡在没有判断1的情况)
#include <bits/stdc++.h>
#include <iostream>
#define int long long
#define endl '\n'
using namespace std;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,a[200005],sum=0,ans=0;
cin>>n;
for(int i=1;i<=n;i++)
{cin>>a[i];
sum+=a[i];}
int g=sum/n;
for(int i=1;i<=g;i++)
if(sum%i==0)ans++;
if(n>1) cout<<ans;
else cout<<1;
return 0;
}
E.漂亮数组
题目:
解题思路:(贪心)
从前往后依次考虑,每输入一个数,求出总和sum,当sum%k=0时,显然可以分成一组;其次便是要记录余数,当有两个相同的余数出现时,这之间的数也可以。例如:1 1 2 三个数,k=3时,sum1%k=1,sum2%k=2,sum3%k=1,余数1出现两次,则中间的1和2满足。
代码如下:
#include <bits/stdc++.h>
#include <iostream>
#define int long long
#define endl '\n'
using namespace std;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,k,a,sum=0,ans=0;
map<int,int>s;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a;
sum=(sum+a)%k;
if(sum==0||s[sum])
{sum=0;
s.clear();
ans++;}
else
s[sum]=1;
}
cout<<ans;
return 0;
}
G.数三角形(easy)
题目:
解题思路:
将三角形的三个顶点作为关键点,然后判断底边。
代码如下:
#include <bits/stdc++.h>
#include <iostream>
#define int long long
#define endl '\n'
using namespace std;
int n,m,sum[505][505],ans=0;
char s[505][505];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>s[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
sum[i][j+1]=sum[i][j]+(s[i][j]=='*');
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(s[i][j]=='*')
{
int a=i,b=j,c=j,z=1;
a++;b--;c++;
while(a<=n&&b>=1&&c<=m&&s[a][b]=='*'&&s[a][c]=='*')
{
ans+=sum[a][c+1]-sum[a][b]==2*z+1;
z++;a++;b--;c++;
}
}
cout<<ans;
return 0;
}