明码
题意:2个字节为一行,共16行,组成的01矩阵可以表示一个汉字(比赛的时候我居然没有读懂题意_(:з」∠)_,我怕不是一个five)
思路:输出每个数的二进制表示
bitset<8> t; t可以存储8位二进制,t=n则是把n分解成8位二进制 前面补0
int main()
{
freopen("in.txt","r",stdin);
bitset<8> t;
int n;
int cnt=0;
while(cin>>n)
{
cnt++;
t=n;
cout<<t;
if(cnt%2==0) cout<<endl;
}
}
bitset还有个函数 string tmp=t.to_string();//将数值转化为字符串。返回对应的字符串。
直接求二进制
int main()
{
//freopen("in.txt","r",stdin);
int n,m,w[16];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=7;i>=0;--i) {w[i]=n&1;n>>=1;} //不需要区分±
for(int i=15;i>=8;--i) {w[i]=m&1;m>>=1;}
for(int i=0;i<=15;++i)
{
if(w[i])
cout<<'#';
else cout<<' ';
}
cout<<endl;
}
long long ans=pow(9,9);
cout<<ans<<endl;
}
乘积尾零 因子中5的个数
#include<iostream>
#include<cstdio>
using namespace std;
int num=0;
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
while(1)
{
if(n%2==0)
{
n/=2;
}
else if(n%5==0)
{
num++;
n/=5;
}
else
{
break;
}
}
}
cout<<num;
}
测试次数
注释部分的代码是二维写的,未注释的是优化的
#include<bits/stdc++.h>
using namespace std;
int dp[5][1005];//代表第i部手机j层楼的最少测试次数 M层楼 / N个鸡蛋 条件下,最坏情况尝试次数最小的解
//void solve(int phone,int floor)
//{
// for(int i=1;i<=phone;++i)
// for(int j=1;j<=floor;++j)
// dp[i][j]=j;
// for(int i=2;i<=phone;++i)
// {
// for(int j=1;j<=floor;++j) //j是枚举的总楼数
// {
// for(int k=1;k<j;++k) //第一部手机扔出去的位置在k层 手机摔坏了,还有i-1部手机,k-1个楼层要测,手机没摔坏的话。还有i个手机,j-k个楼层要测
// dp[i][j]=min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k])+1);
// }
// }
//}
int ans[1005];
int pre[1005];
void solve(int phoneNum,int floorNum)
{
for(int i=1;i<=floorNum;++i) ans[i]=i;
for(int i=2;i<=phoneNum;++i)
{
for(int j=1;j<=floorNum;++j)
{
pre[j]=ans[j];
ans[j]=j;
}
for(int j=1;j<=floorNum;++j)
for(int k=1;k<j;++k)
{
ans[j]=min(ans[j],max(pre[k-1],ans[j-k])+1);
}
}
}
int main()
{
//首先初始化为最坏情况
solve(3,1000);
//cout<<dp[3][1000]<<endl;
cout<<ans[1000]<<endl;
}
递增三元组
题意:请你统计有多少个三元组(i, j, k) 满足:1. 1 <= i, j, k <= N 2. Ai < Bj < Ck
先前一直以为lower_bound(a.begin(),a.end())-a返回的是从a.begin()开始算的第几个
//最大数据是1e5,三重循环和二重循环都不OK
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],b[N],c[N];
int sum=0;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i) cin>>b[i];
for(int i=1;i<=n;++i) cin>>c[i];
sort(a+1,a+1+n);
sort(b+1,b+1+n);
sort(c+1,c+1+n);
for(int i=1;i<=n;++i)
{
int x=lower_bound(a+1,a+1+n,b[i])-a-1; //找到大于等于b[i]的第一个下标 查找a数组中多少小于b[i]的 x是下标,1~x总共x个
int y=upper_bound(c+1,c+1+n,b[i])-c-1; //在c中的下标是y,那么比c[i]大的数有y+1..n 总共n-y个
cout<<x<<' '<<y<<endl;
sum+=(x)*(n-y);
cout<<sum<<endl;
}
cout<<sum<<endl;
return 0;
}
//好叭,我知道了
螺旋线
找规律,会发现y=x(x>=0)和y=x+1(x<0)直线上的整点都是平方数,以他们为基准加减即可
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
LL dist(int x,int y)
{
if(x==y&&x>=0) return (2*x)*(2*x);
else if(y==x+1&&x<0)
{
x=-x;
return (2*x-1)*(2*x-1);
}
if((x>=0&&y>=x)||(x<=0&&y>=-x)) return dist(y,y)-(y-x); //y>0
if((x>=0&&y>=0&&y<=x)||(x>=0&&y<=0&&y>=-x)) return dist(x,x)+(x-y);
if((x>=0&&y<=0&&y<=-x)||(x<=0&&y<=0&&y<=x+1)) return dist(y-1,y)-(x-(y-1));
if((x<=0&&y>=0&&y<=-x)||(x<=0&&y<=0&&y>=x+1)) return dist(x,x+1)+(y-(x+1));
}
int main()
{
int x,y;
while(cin>>x>>y)
{
cout<<dist(x,y)<<endl;
}
return 0;
}
全球变暖
题意:与海洋相邻的岛屿都会被淹没,问未来会有多少岛屿完全淹没
注意:可能一些陆地被淹没后,岛屿被分成了两部分,那么这个岛屿就没被完全淹没 不能直接拿淹没前的岛屿数减去淹没后的岛屿数
思路:把每个岛屿赋予了一个编号,将未被淹没的陆地放在一个新数组中,遍历这个新数组中陆地的编号,用set去重
拿淹没前的岛屿编号数减去淹没后的岛屿编号数
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
const int N=1e3+10;
char a[N][N];
char b[N][N];
int vis[N][N];
set<int>s;
int dx[5]={0,0,0,1,-1};
int dy[5]={-1,1,0,0,0};
int n;
int len=0;
void dfs(int x,int y,int cnt)
{
if(a[x][y]=='.') return ; //这是废话
if(a[x][y]=='#'&&vis[x][y]==-1)
{
vis[x][y]=cnt;
int flag=1;
for(int i=0;i<5;++i)
{
int x2=x+dx[i],y2=y+dy[i];
if(x2>=1&&x2<=n&&y2>=1&&y2<=n)
{
if(a[x2][y2]=='.') flag=0; // 我先把边缘的给淹了,自然最后啥也不剩
else dfs(x2,y2,cnt);
}
}
if(flag)
b[x][y]='#';
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
cin>>a[i][j];
memset(vis,-1,sizeof(vis));
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
b[i][j]='.';
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
if(a[i][j]=='#'&&vis[i][j]==-1)
{
++len; //从1开始打标签
dfs(i,j,len);
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
if(b[i][j]=='#')
{
s.insert(vis[i][j]);
cout<<vis[i][j]<<endl;
}
}
cout<<len-s.size()<<endl;
return 0;
}