洛谷(计数、均分纸牌、最大正方形)

计数

洛谷(计数、均分纸牌、最大正方形)_第1张图片

代码:

(1)二分法

#include
#include
using namespace std;
typedef long long LL;
int main()
{
	LL n,m;
	cin>>n>>m;
	LL l=0,r=n;
	LL res=0;
	while(l>1;
		if(pow(mid,m)<=n){
			res+=(mid-l);
			l=mid;
		}
		else r=mid-1;	
	}
	cout<

 想到二分,做的时候一直感觉应该很简单,代码没错误,但是就是不正确,原来错误竟在幂上,很很很基础的知识点,^在C++是异或,在python是幂,C++,C幂是pow(),长教训啦!;

(2)当然也可以用暴力求解:

#include
#include
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	int res=0;
	if(m==1)cout<

(3)直接用数学方法,对n开m次方,不过要注意数据类型,如t是int型不能省

#include
#include
using namespace std;
int main(void)
{	
	int t;
	double n,m;
	cin>>n>>m;
	t=pow(n,1.0/m);
	cout<

均分纸牌
洛谷(计数、均分纸牌、最大正方形)_第2张图片

代码:

来自acwing大佬

洛谷(计数、均分纸牌、最大正方形)_第3张图片  

#include 
using namespace std;
const int N = 110;
int n, a[N], s[N];

int main() {
    cin >> n;
    for(int i = 1; i <= n ; i++) {
        cin >> a[i];
        s[i] = s[i - 1] + a[i];
    }
    int res=0; 
    if(s[n] % n) cout<<"No anser";
    else 
        for(int i = 1; i <= n; i++) {
            if(s[i] == i * s[n] / n) continue;
            res++;
        }
    cout << res;
    return 0;
}

最大正方形

洛谷(计数、均分纸牌、最大正方形)_第4张图片

 代码:

#include
using namespace std;
const int N=1010;
int n,m,res;
int a[N][N],s[N][N];
 
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];  //二维前缀和公式 
        }
    }
    for(int i=1;i<=n;i++) 
		for(int j=1;j<=m;j++) {
			for(int l=1;l<=min(n,m);l++) {
				int rx=i+l-1;  //枚举边长 
				int ry=j+l-1;
				if(rx>n || ry>m || s[rx][ry]-s[rx][j-1]-s[i-1][ry]+s[i-1][j-1]!=l*l) break;//不能超出边界并且不含0 
				if(res

考察二维前缀和,不过题目中正方形需要仔细想一下 

你可能感兴趣的:(洛谷,洛谷,算法,c++)