计数
代码:
(1)二分法
#include<iostream>
#include<math.h>
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<r)
{
LL mid=l+r+1>>1;
if(pow(mid,m)<=n){
res+=(mid-l);
l=mid;
}
else r=mid-1;
}
cout<<res;
return 0;
}
想到二分,做的时候一直感觉应该很简单,代码没错误,但是就是不正确,原来错误竟在幂上,很很很基础的知识点,^在C++是异或,在python是幂,C++,C幂是pow(),长教训啦!;
(2)当然也可以用暴力求解:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int res=0;
if(m==1)cout<<n;
else
{
for(int i=1;;i++)
{
if(pow(i,m)<=n)res++;
else break;
}
cout<<res;
}
return 0;
}
(3)直接用数学方法,对n开m次方,不过要注意数据类型,如t是int型不能省
#include<iostream>
#include<math.h>
using namespace std;
int main(void)
{
int t;
double n,m;
cin>>n>>m;
t=pow(n,1.0/m);
cout<<t;
return 0;
}
均分纸牌

代码:
来自acwing大佬
#include <iostream>
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;
}
最大正方形
代码:
#include<iostream>
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<l) res=l;
}
}
cout<<res;
return 0;
}
考察二维前缀和,不过题目中正方形需要仔细想一下