计数找规律题
第一层1个,第二层1+2个,第三层1+2+3个,第四层1+2+3+4个。。。
cpp
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int a[105]={0};
a[1]=1;
for(int i=2;i<=100;i++)
{
a[i]=a[i-1]+i;
}
int sum=0;
for(int i=1;i<=100;i++)
{
sum+=a[i];
}
cout<<sum<<endl;
return 0;
}
枚举
cpp
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int sum(int x)
{
return (x+1)*x/2;
}
int main()
{
for(int i=1;i<=100;i++)
{
for(int j=i+1;j<=100;j++)
{
if(sum(j)-sum(i-1)==236)
{
cout<<i<<endl;
return 0;
}
}
}
return 0;
}
dfs来枚举不同的全排列,然后看是否符合要求
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int path[10];
bool st[10];
int cnt=0;
bool check()
{
double a=(double)path[1];
double b=(double)path[2]/path[3];
double x=(double)path[4]*100+path[5]*10+path[6];
double y=(double)path[7]*100+path[8]*10+path[9];
if(path[3]==0||path[7]==0)return false;
if(path[4]==0||path[7]==0)return false;
if(fabs(a+b+x/y-10)<1e-8)
{
return true;
}
return false;
}
void dfs(int x)
{
if(x>9)
{
if(check())
{
cnt++;
}
return;
}
for(int i=1;i<=9;i++)
{
if(!st[i])
{
st[i]=true;
path[x]=i;
dfs(x+1);
st[i]=false;
}
}
}
int main()
{
dfs(1);
cout<<cnt<<endl;
return 0;
}
其实就是dfs/bfs解决就行
cpp
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=4;
int dx[8]={1,-1,0,0,1,1,-1,-1};
int dy[8]={0,0,1,-1,1,-1,1,-1};
int g[3][4]={{0,1,1,1},{1,1,1,1},{1,1,1,0}};
int grid[N][N];
bool used[10];
int ans=0;
bool check(int x,int y)
{
for(int k=0;k<8;k++)
{
int nx=x+dx[k];
int ny=y+dy[k];
if(nx>=0&&nx<3&&ny>=0&&ny<4&&g[nx][ny]==1)
{
if(grid[nx][ny]!=-1&&(abs(grid[nx][ny]-grid[x][y])==1))
{
return false;
}
}
}
return true;
}
void dfs(int x)
{
if(x==10)
{
ans++;
return;
}
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
if(g[i][j]==1&&grid[i][j]==-1)
{
for(int num=0;num<=9;num++)
{
if(!used[num])
{
grid[i][j]=num;
if(check(i,j))
{
used[num]=true;
dfs(x+1);
used[num]=false;
}
grid[i][j]=-1;
}
}
return;
}
}
}
}
int main()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
grid[i][j]=-1;
}
}
dfs(0);
cout<<ans<<endl;
return 0;
}
dfs枚举(选或者不选问题)
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5000010;
int n;
int cnt=0;
int m=0;
int path[5];
bool found=false;
void dfs(int x,int sum,int start)
{
if(found)return;
if(sum>n)return;
if(x>4)
{
if(sum==n)
{
for(int i=1;i<=4;i++)
{
cout<<path[i]<<' ';
found=true;
}
}
return;
}
for(int i=start;i*i<=n;i++)
{
path[x]=i;
dfs(x+1,sum+i*i,i);
if(found)return;
}
}
int main()
{
cin>>n;
dfs(1,0,0);
return 0;
}
贪心,从头开始遍历,当找到a[i]!=i的时候,就找i所在的位置然后进行交换
cpp
#include<iostream>
using namespace std;
const int N = 10010;
int n;
int a[N];
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
int ans = 0;
// 贪心:直接把每个数放到正确位置
for(int i = 1; i <= n; i++) {
while(a[i] != i) { // 如果当前位置的数不对
swap(a[i], a[a[i]]); // 把它和它应该在的位置交换
ans++;
}
}
cout << ans << endl;
return 0;
}
直接找两个相邻的进行求解(但是会部分错误)
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
int n;
typedef long long ll;
ll x[N];
int gcd(int a,int b)
{
return (b==0)?a:gcd(b,a%b);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x[i];
}
int m=1;
sort(x+1,x+1+n);
for(int i=2;i<=n;i++)
{
if(x[i]!=x[m])
{
x[++m]=x[i];
}
}
ll p=x[2]/gcd(x[2],x[1]);
ll q=x[1]/gcd(x[2],x[1]);
cout<<p<<"/"<<q<<endl;
return 0;
}