A.第几天
用Excel
B.明码
十进制转二进制有符号数补码
1.将有符号数化为无符号数
unsigned int n=x;
2.与运算取出最后一位
s.push_back(n&1);
3.看作二进制右移一位
n>>=1;
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int N=1e5+5;
typedef long long LL;
using namespace std;
vector<int> s;
int n,cnt;
int a[N];
void ten2two(int x)
{
unsigned int n=x;
s.clear();
int cnt=0;
if(n==0) cout<<" ";
//求二进制补码
while(n&&cnt<8)
{
s.push_back(n&1);
n>>=1;
cnt++;
}
if(s.size()<8)
{
for(int i=0; i<8-s.size(); i++) cout<<" ";
}
for(int i=s.size()-1; i>=0; i--)
{
if(s[i]==0)
cout<<" ";
else
printf("%d",s[i]);
}
}
int main()
{
for(int i=0; i<32; i++)
cin>>a[i];
for(int i=0; i<32; i++)
{
cnt++;
ten2two(a[i]);
if(cnt%2==0)
{
printf("\n");
cnt=0;
}
}
}
C.乘积尾零
解题思路:
题目:计算多少个零
先找出多少个能相乘等于零的
需要计算出里面有多少个数是包含五和二的
然后2和5个数最小值,即是0的个数
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int N=1e5+5;
typedef long long LL;
using namespace std;
int x,cnt2=0,cnt5=0;
int main()
{
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
cin>>x;
while(x%2==0) cnt2++,x=x/2;
while(x%5==0) cnt5++,x=x/5;
}
}
cout<<min(cnt2,cnt5)<<endl;
}
D.测试次数
DP
E.快速排序
if(i - l + 1 == k) return a[i];
if(i - l + 1 < k) return quick_select(a, i-1, r, k);//填空
else return quick_select(a, l, i - 1, k);
F.递增三元组
sort+二分STL
lower_bound
排序后,即找到多个等于num的数字,一系列数的下界,a[i]>=num
upperbound
排序后,即找到多个等于num的数字,一系列数的上界,a[i]>num
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int N=1e5+5;
typedef long long LL;
using namespace std;
int n;
int a[N],b[N],c[N];
LL sum=0;
int main()
{
scanf("%d",&n);
for(int i=0; i<n; i++) scanf("%d",&a[i]);
for(int i=0; i<n; i++) scanf("%d",&b[i]);
for(int i=0; i<n; i++) scanf("%d",&c[i]);
sort(a,a+n);
sort(b,b+n);
sort(c,c+n);
//遍历B
for(int i=0; i<n; i++)
{
/*
注意:虽然a1和a2都是10^5,不会爆int
但是他们乘起来后,10^10会爆int,自动类型变换,他们的结果也会是int
所以要定义为LL
*/
LL a1=(lower_bound(a,a+n,b[i])-a);
LL c1=n-(upper_bound(c,c+n,b[i])-c);
sum=sum+a1*c1;
}
printf("%lld\n",sum);
}
G.螺旋折线
找规律,限制边界
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
typedef long long LL;
using namespace std;
LL sum=0;
int main()
{
LL x,y;
cin>>x>>y;
if(abs(x)<=y&&y>=0)
{
cout<<(2*y-1)*(2*y)+(x+y)<<endl;
return 0;
}
if(abs(y)<=x&&x>=0)
{
cout<<(2*x)*(2*x)+(x-y)<<endl;
return 0;
}
if(abs(x)<=abs(y)+1&&y<0)
{
cout<<(2*abs(y)+1)*(2*abs(y))+(abs(y)-x)<<endl;
return 0;
}
if(abs(y)<=abs(x)&&x<0)
{
cout<<(2*abs(x)-1)*(2*abs(x)-1)+(y-(x+1))<<endl;
return 0;
}
}
H.日志统计
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int N=1e6+5;
const int N1=1e5+5;
typedef long long LL;
typedef pair<int,int> PII;
vector<int> s;
PII blog[N];
int n,d,k;
int cnt[N1];
bool st[N1];
int main()
{
scanf("%d %d %d",&n,&d,&k);
int maxt=0;
for(int i=1; i<=n; i++)
{
scanf("%d %d",&blog[i].first,&blog[i].second);
maxt=max(blog[i].first,maxt);
}
sort(blog,blog+n);
blog[0].first=-1;
//T为当前时刻
//只枚举出现过的时刻
for(int T=blog[1].first,z=1; z<=n; z++,T=blog[z].first)
{
if(T==blog[z-1].first) continue;
else
{
memset(cnt,0,sizeof(cnt));
for(int i=z; i<=n; i++)
{
int t=blog[i].first;
int id=blog[i].second;
if(t>=T&&t<T+d)
cnt[id]++;
if(cnt[id]>=k&&st[id]!=true)
{
s.push_back(id);
st[id]=true;
}
}
}
}
sort(s.begin(),s.begin()+s.size());
for(int i=0; i<s.size(); i++)
{
printf("%d\n",s[i]);
}
return 0;
}