2023/3/1
乘积尾零
分解成2和5,答案即为min(2的个数,5的个数)
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
int a[100]={
5650 ,4542, 3554, 473 ,946, 4114 ,3871 ,9073, 90, 4329,
2758 ,7949, 6113, 5659, 5245, 7432, 3051, 4434, 6704, 3594,
9937, 1173, 6866, 3397, 4759, 7557, 3070, 2287, 1453, 9899 ,
1486 ,5722, 3135, 1170, 4014, 5510, 5120, 729 ,2880, 9019 ,
2049 ,698 ,4582 ,4346 ,4427 ,646, 9742, 7340, 1230, 7683 ,
5693 ,7015, 6887, 7381, 4172, 4341, 2909, 2027, 7355, 5649,
6701 ,6645, 1671, 5978, 2704, 9926, 295, 3125 ,3878, 6785 ,
2066 ,4247, 4800, 1578, 6652, 4616 ,1113, 6205, 3264, 2915 ,
3966 ,5291 ,2904, 1285 ,2193, 1428, 2265, 8730, 9436, 7074,
689, 5510, 8243, 6114 ,337 ,4096, 8199 ,7313, 3685,211
};
int a2,a5;
void slove(){
for(int i=0;i<100;i++){
while(a[i]%5==0){
a[i]/=5;
a5++;
}
while(a[i]%2==0){
a[i]/=2;
a2++;
}
}
cout<<min(a2,a5)<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
全球变暖
一个岛屿如果有一个点四个方向都是陆地则不会淹没
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
int n;
char a[1005][1005];
int sx[4]={0,0,1,-1},sy[4]={1,-1,0,0};
bool vis[1005][1005],p;
void dfs(int x,int y){
vis[x][y]=true;
bool t=false;
for(int i=0;i<4;i++){
int xx=x+sx[i],yy=y+sy[i];
if(xx<1||xx>n||yy<1||yy>n||vis[xx][yy])continue;
if(a[xx][yy]=='.')t=true;
else dfs(xx,yy);
}
if(!t)p=true;
}
void slove(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)cin>>a[i][j];
}
int ans=0,res=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(!vis[i][j]&&a[i][j]=='#'){
p=false;
dfs(i,j);
res++;
if(p)ans++;
}
}
}
cout<<res-ans<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
第几天
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
void slove(){
cout<<31+29+31+30+4<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
明码
题目意思比较绕
简单的说就是一个字由32个字节表示,每个字节为8位二进制数,每行2个字节。
例如第一行表示
最后得出的汉字为 “ 九的九次方是多少?”
计算该答案
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
void prt(int x){
if(x<0)cout<<"1";
else cout<<" ";
for(int k=6;k>=0;k--){
if((x>>k)&1)cout<<"1";
else cout<<" ";
}
}
void slove(){
int cnt=0;
for(int i=1;i<=10;i++){
for(int j=1;j<=16;j++){
int x;
cin>>x;
prt(x);
cin>>x;
prt(x);
cout<<endl;
}
}
}
int main(){
// ios::sync_with_stdio(false);
// cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
freopen("zi.in","r",stdin);
freopen("c.out","w",stdout);
slove();
fclose(stdin);
fclose(stdout);
}
return 0;
}
测试次数
一开始我以为是用二分的求法直接对半去摔,然后看到了《每个商家抽样3部手机》。
只有1部手机的时候如果摔坏了就没得测试了所以只能从小到大测试
当有2部手机的时候就可以有一部手机可以跳着测
假如我当前从第k层摔下来,那么有2种情况
1.摔坏了,那我还剩一部手机可以只需要测1~k-1楼
2.没摔坏,那我可以继续测
三部手机也是如此
于是可以得出dp[i][j],表示测了i层,有j部手机需要多少次
dp[i][1]=i
dp[i][j]=min(dp[i][j],max(dp[i-k][j],dp[k-1][j-1])+1) …(j>1)
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
int dp[1005][3];
void slove(){
int n=1000;
for(int i=0;i<=n;i++)dp[i][1]=i;
for(int j=2;j<=3;j++){
for(int i=1;i<=n;i++){
dp[i][j]=n;
for(int k=2;k<=i;k++){
dp[i][j]=min(dp[i][j],max(dp[i-k][j],dp[k-1][j-1])+1);
}
}
}
cout<<dp[n][3]<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
递增三元组
对于每个数组从小到大排序
B数组从后往前二分去找到第一个大于Bj的Ck则对于当前j有n-k+1个大于当前的情况
为了使得A数组统计时只需要查找B所以在每个B的位置从后往前前缀和加上后面的情况数量
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
void slove(){
int n;
cin>>n;
vector<int>a(n),b(n),c(n);
vector<ll>s(n+1,0);
for(auto &x:a)cin>>x;
for(auto &x:b)cin>>x;
for(auto &x:c)cin>>x;
sort(a.begin(),a.end());
sort(b.begin(),b.end());
sort(c.begin(),c.end());
for(int i=n-1;i>=0;i--){
int j=upper_bound(c.begin(),c.end(),b[i])-c.begin();
s[i]=s[i+1];
s[i]+=n-j;
}
ll ans=0;
for(int i=0;i<n;i++){
int j=upper_bound(b.begin(),b.end(),a[i])-b.begin();
ans+=s[j];
}
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
日志统计
对于每个id的t存入vector中,每一个vector从小到大排序,如果存在a[i+k-1]-a[i]<D则为热帖
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
int n,d,k;
void slove(){
cin>>n>>d>>k;
int cnt=0;
unordered_map<int,int>mp;
vector<vector<int>>a;
for(int i=1;i<=n;i++){
int t,id;
cin>>t>>id;
if(!mp.count(id)){
mp[id]=cnt++;
vector<int>b;
a.push_back(b);
}
a[mp[id]].push_back(t);
}
vector<int>ans;
for(auto [id,i]:mp){
int m=a[i].size();
if(m<k)continue;
sort(a[i].begin(),a[i].end());
for(int j=0;j+k-1<m;j++){
if(a[i][j+k-1]-a[i][j]<d){
ans.push_back(id);
break;
}
}
}
sort(ans.begin(),ans.end());
for(auto id:ans){
cout<<id<<endl;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}
乘积最大
当k为偶数时
答案一定为非负数,只需要将数组排序后从前后2个2个取比大小即可得
若k为奇数时
1.全为负数则答案为负数
2.选取一个非负数后当作k为偶数的情况
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
#define int long long
const int mod=1e9+9;
void slove(){
int n,k;
cin>>n>>k;
vector<int>a(n);
for(auto &x:a)cin>>x;
sort(a.begin(),a.end());
int ans=1;
int l=0,r=n-1;
int f=1;
if(k%2){
ans=a[r];
r--;
k--;
if(ans<0)f=-1;
}
while(k){
int x=a[l]*a[l+1],y=a[r]*a[r-1];
if(x*f>=y*f){
ans=x%mod*ans%mod;
l+=2;
}
else {
ans=y%mod*ans%mod;
r-=2;
}
k-=2;
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--){
slove();
}
return 0;
}