1.36进制
题目: 对于16进制,我们使用字母A-F来表示10及以上的数字。 直接模拟 1040254 |
2.瓷砖样式
题目: 小明家的一面装饰墙原来是 3*10 的小方格。
结果:101448 |
#include<iostream>
#include<cstdio>
#include<set>
#include<string.h>
#define ll long long
#define mo 19270817
using namespace std;
int mp[5][15];
int ans;
set<ll> hash;
bool check()
{
for(int i=1;i<=3;i++)
{
for(int j=1;j<=10;j++)
{
if(mp[i][j] == mp[i][j+1]&&mp[i][j] == mp[i+1][j]&&mp[i][j] == mp[i+1][j+1])
return false;
}
}
return true;
}
void dfs(int x,int y) //0 黄色横/竖着放,1 橙色横/竖着放
{
//cout<<x<<" "<<y<<endl;
if( mp[x][y]==-1 )
{
if( y+1<=10 && mp[x][y+1]==-1 ) //横着涂
{
for(int i=0;i<2;i++)
{
mp[x][y]=i;mp[x][y+1]=i;
if(y==10)dfs(x+1,1);
else dfs(x,y+1);
mp[x][y]=-1;mp[x][y+1]=-1;
}
}
if( x+1<=3 && mp[x+1][y]==-1 ) //竖着涂
{
for(int i=0;i<2;i++)
{
mp[x][y]=i;mp[x+1][y]=i;
if( y==10 )dfs(x+1,1);
else dfs(x,y+1 );
mp[x][y]=-1;mp[x+1][y]=-1;
}
}
}
else
{
if(x==3 && y==10)
{
if( check() )// 计数没有去重,ans++;
{
int base=2,sum=0;
for(int i=1;i<=3;i++)
{
for(int j=1;j<=10;j++)
{
sum+=mp[i][j]*base%mo;
base*=2;
}
}
if( !hash.count(sum) ) //产生一个hash---对于一个答案
{ hash.insert(sum); ans++; }
}
return ;
}
if( y==10 )dfs(x+1,1);
else dfs(x,y+1);
}
}
int main()
{
memset( mp,-1,sizeof(mp) );
dfs(1,1);
cout<<ans<<endl;
return 0;
}
3.希尔伯特曲线
按照题意去想一下就好了,我们需要注意的是左下角的虽然是顺时针,但是实际上坐标并不是顺时针变化的,所以我们还是要根据他的序号是多少进行操作,所以答案需要看一下曲线才能看出来,最后用代码测一下就好了
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
long long f(int n, int x, int y) {
if (n == 0) return 1;
int m = 1 << (n - 1);
if (x <= m && y <= m) {
return f(n - 1, y, x);
}
if (x > m && y <= m) {
return 3LL * m * m + f(n - 1, m-y+1 , m * 2 - x + 1); //代码填空
}
if (x <= m && y > m) {
return 1LL * m * m + f(n - 1, x, y - m);
}
if (x > m && y > m) {
return 2LL * m * m + f(n - 1, x - m, y - m);
}
}
int main() {
int n, x, y;
scanf("%d %d %d", &n, &x, &y);
printf("%lld", f(n, x, y));
return 0;
}
4.发现环(dfs+并查集)
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=100005;
int n;
int fa[N];
vector<int> G[N];
int vis[N];
int ans[N];
int node,flag,len;
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void init()
{
for(int i=0;i<=n;i++)
{
fa[i]=i;
}
}
void dfs(int x,int num)
{
if(x==node && num)
{
sort(ans,ans+num);
flag=1;len=num;
return ;
}
for(int i=0;i<G[x].size();i++)
{
int u=G[x][i];
if(vis[u]==0 && !flag )
{
ans[num]=u;
vis[u]=1;
dfs(u,num+1);
vis[u]=0;
}
}
}
int main()
{
cin>>n;
init();
int u,v;
for(int i=0;i<n;i++)
{
cin>>u>>v;
G[u].pb(v);
G[v].pb(u);
int fu=find(u);
int fv=find(v);
if(fu!=fv)
{
fa[fv]=fu; //合并
}
else
{ //出现环路
node=u;
}
}
dfs(node,0); //顶点编号从1开始
for(int i=0;i<len;i++)
{
cout<<ans[i]<<" ";
}
return 0;
}
5,对局匹配
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#define pb push_back
using namespace std; //1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000
int n,k;
vector<int> p;
int main()
{
int x;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>x;
p.pb(x);
}
sort(p.begin(),p.end()); //小-大
int y1,y2;int index1,index2=-1;
int ans=0;
//vector<int>:: iterator it;
for(int i=0;i<n;i++)
{
if(p[i]==-1)
continue;
y1=p[i]+k;
index1=lower_bound(p.begin()+i+1,p.end(),y1) - p.begin(); //返回>=p[i]的下标[i+1,n)
if( p[index1]==y1 && index1!=n)
{
//cout<<"index1="<<index1<<" ";
p[index1]=-1;
p[i]=-1;
ans++; //已经匹配的
}
}
int res=ans+(n-ans*2);
cout<<res<<endl;
return 0;
}