2022 1-13
阿新 • • 發佈:2022-01-13
題意:
給你n個數a ,找到一個數x(具有k位),使他與n個數的dis(x,ai)和最小
dis(x,y) x,y轉化為二進位制後 對應位不同位數的和;
思路:
統計每個數a的轉化為二進位制後,出現1的位置上加一;
遍歷k位 某一位出現次數大於 n/2 ;則要找的數該位為1;
程式碼:
#include <iostream> #include <bits/stdc++.h> #define ll long long using namespace std; ll a,sum[35]; ll qk(int a,int b){ ll ans=1; while(b){ if(b&1) ans=ans*a; a*=a; b>>=1; } return ans; } int main() { int t; cin>>t; while(t--){ int n,k,tot=1; cin>>n>>k; memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++){ cin>>a;tot=1; while(a){ int p=a%2; if(p) sum[tot++]++; else tot++; a=a/2; } } ll maxn=-1; ll res=0; for(int i=1;i<=k;i++) if(sum[i]>(n/2)) res+=qk(2,i-1); cout<<res<<endl; } return 0; }
題意:
找最長倆子序列 使其對應位 有一對相同數字
程式碼:
#include <iostream> #include <bits/stdc++.h> using namespace std; struct node { int l; int r; }a[150010]; int vis[150010]; int res=-1; int main() { int t; cin>>t; while(t--){ int n,b; int res=-1; memset(vis,0,sizeof(vis)); cin>>n; for(int i=1;i<=n;i++){ cin>>b; vis[b]++; if(vis[b]>1){ int minl=min(a[b].l,i-1); int minr=min(a[b].r,n-i); int ans=minl+minr; res=max(ans,res); } a[b].l=i-1; a[b].r=n-i; } if(res==-1){ cout<<-1<<endl; continue; } cout<<res+1<<endl; } return 0; }
題意:
輸入n,m, kk
n個道路標識 初始城市到目標城市距離 m 你可以最多刪去的速度標識 kk個
n個標識的座標d[](距初始城市距離)
n個標識限速為v[]
求刪去kk個標識內 你可以最快到達目標城市;
思路:
DP: dp[i][j] 前i個裡留有j個標識 1->i 的最少時間; 因為第一個不能刪dp[1][1]=0; 求最少 取min dp[][]初始化為inf; 三重迴圈 dp[i][j]=min(dp[i][j],dp[k][j-1]+(d[i]-d[k])*v[k]) 1<=k<i k->i 內標識刪掉; 留k標識限速*k->i距離 + 前k個裡留下j-1的dp(k標識留了) (d[i]-d[k])*v[k] + dp[k][j-1] i: 1->n+1 前i個標識裡 j: 1->i 留下j個 k: 1->i 用k遍歷[1,i)內標識 k->i的距離
#include <iostream>
#define ll longlong
#include <bits/stdc++.h>
const int inf=0x3f3f3f3f;
// dp[i][j] 前i個裡留j個;
using namespace std;
int dp[555][555],d[555],v[555];
int main()
{
int n,m,kk;
cin>>n>>m>>kk;
for(int i=1;i<=n;i++) cin>>d[i];d[n+1]=m;
for(int i=1;i<=n;i++) cin>>v[i];
for(int i=0;i<=n+5;i++)
for(int j=0;j<=n+5;j++)
dp[i][j]=inf;
dp[1][1]=0;
for(int i=2;i<=n+1;i++)
for(int j=1;j<=i;j++)
for(int k=1;k<i;k++){
dp[i][j]=min(dp[i][j],dp[k][j-1]+(d[i]-d[k])*v[k]);
//cout<<i<<" "<<j<<" "<<dp[i][j]<<" ";
}
int ans=inf;
for(int i=0;i<=kk;i++)
ans=min(ans,dp[n+1][n+1-i]);
cout<<ans<<endl;
return 0;
}