[Offer收割]程式設計練習賽49
A.相似顏色
每兩位列舉一下0~15,更新一下就好了。。
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,a,b) for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)
#define CLR(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const double eps=1e-8;
const int INF=0x3f3f3f3f;
const ll LL_INf=0x3f3f3f3f3f3f3f3f;
const int N=100000+10;
const int mod=1e8+7;
int tran(char c){
if ('0'<=c&&c<='9') return c-'0';
else return c-'a' +10;
}
int encode(char a,char b){
return 16*tran(a)+tran(b);
}
char decode(int a){
if (a>=0&&a<=9) return a+'0';
else return a-10+'a';
}
string s;
int num[3];
int main(){
cin>>s;
cout<<'#';
num[0]=encode(s[1],s[2]);
num[1]=encode(s[3],s[4]);
num[2 ]=encode(s[5],s[6]);
// FOR(i,0,3) cout<<num[i]<<' '<<endl;
FOR(i,0,3){
int big=INF;
int k;
for(int j=0;j<=15;j++){
int tmp=16*j+j;
if ((tmp-num[i])*(tmp-num[i])<big){
big=(tmp-num[i])*(tmp-num[i]);
k=tmp;
}
}
// cout<<"k="<<k<<endl;
cout<<decode(k%16);
}
}
B.挑選子集
如果知道剩餘系的概念,這題應該就秒了。。
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,a,b) for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)
#define CLR(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const double eps=1e-8;
const int INF=0x3f3f3f3f;
const ll LL_INf=0x3f3f3f3f3f3f3f3f;
const ll mod=1000000009;
const int N=1000+10;
int n,m,k,num;
ll c[N][N],a[N],b[N],ans;
int main(){
c[0][0]=1;
REP(i,1,100){
c[i][0]=1;
REP(j,1,i){
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
}
cin>>n>>m>>k;
FOR(i,0,n) cin>>b[i];
// n=unique(b,b+n)-b;
FOR(i,0,n) {
a[b[i]%k]++;
}
REP(i,0,k-1) ans=(ans+c[ a[i] ][m])%mod;
cout<<ans<<endl;
}
C.矩陣迷宮
動態規劃,用dp[i][j][k][0]和dp[i][j][k][1]表示,到(i,j)格改變了k次移動方向分別方向為向右和向下時所需支付的最小代價
唯一的坑點就是,由於2的冪很大,所以k不能列舉到n,也並不需要列舉到n,列舉20就差不多了,因為可以保證,只用改變一次方向並且只用200*100代價就能到終點。。很多人因為這個只有30分
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,a,b) for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)
#define CLR(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const double eps=1e-8;
const int INF=0x3f3f3f3f;
const ll LL_INF=0x3f3f3f3f3f3f3f3f;
const int mod=1e8+7;
const int N=100+10;
ll dp[N][N][N][2];
int n,a[N][N];
ll ans;
int main(){
cin>>n;
REP(i,1,n){
REP(j,1,n){
cin>>a[i][j];
}
}
memset(dp,0x3f,sizeof(dp));
dp[1][1][0][0]=a[1][1];
dp[1][1][0][1]=a[1][1];
REP(i,1,n){
REP(j,1,n){
if (i==1&&j==1) continue;
REP(k,0,15){
dp[i][j][k][0]=min(dp[i][j-1][k][0]+a[i][j],dp[i][j][k][0]);
if (k) dp[i][j][k][0]=min(dp[i-1][j][k-1][1]+(1<<k-1)+a[i][j],dp[i][j][k][0]);
dp[i][j][k][1]=min(dp[i-1][j][k][1]+a[i][j],dp[i][j][k][1]);
if (k) dp[i][j][k][1]=min(dp[i][j-1][k-1][0]+(1<<k-1)+a[i][j],dp[i][j][k][1]);
}
}
}
// REP(k,0,2*n){
// REP(i,1,n){
// REP(j,1,n){
// cout<<dp[i][j][k][0]<<'/'<<dp[i][j][k][1]<<' ';
// }
// cout<<endl;
// }
// cout<<endl;
// }
ans=LL_INF;
REP(k,0,15){
REP(i,0,1){
ans=min(ans,dp[n][n][k][i]);
}
}
cout<<ans<<endl;
return 0;
}
D.第K小先序遍歷
比賽時,由於放在第四題,很多人(我)以為很難,其實並不是很難。。這題有Catalan的背景,給出一個n個點的二叉樹的中序遍歷,求有多少顆不相同的樹,答案就是Catalan樹,知道這個之後,感覺一下,先對元素大小排序,通過k,知道第一個數是哪一位,然後不斷分成兩棵樹,分治下去就好了。。
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define CLR(a) memset(a,0,sizeof(a))
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,a,b) for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)
#define DBG(x) cout<<"x"<<'='<<x<<endl;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const double eps=1e-8;
const int INF=0x3f3f3f3f;
const ll LL_INf=0x3f3f3f3f3f3f3f3f;
const ll mod=1000000009;
const int N=30+10;
int n,k,a[N];
vector<int> ans;
ll T[N];
void solve(int l,int r,ll k){
// cout<<"l="<<l<<" r="<<r<<" k="<<k<<endl;
if (l>r) return;
vector< pair<int,ll> > p;
REP(i,l,r) p.push_back( make_pair(a[i],i) );
sort(p.begin(),p.end());
// FOR(i,0,p.size()) cout<<p[i].second<<' ';
// cout<<endl;
int pos;
FOR(i,0,p.size()){
pos=p[i].second;
ll num=T[pos-l]*T[r-pos];
if (k-num<=0) {
ans.push_back(p[i].first);
break;
}
k-=num;
}
ll k1=(k-1)/T[r-pos]+1;
ll k2=(k-1)%T[r-pos]+1;
solve(l,pos-1,k1);
solve(pos+1,r,k2);
}
int main(){
cin>>n>>k;
REP(i,1,n) cin>>a[i];
T[0]=T[1]=1;
REP(i,2,n){
REP(j,0,i-1){
T[i]+=T[j]*T[i-1-j];
}
}
solve(1,n,k);
FOR(i,0,n) cout<<ans[i]<<endl;
return 0;
}
相關推薦
[Offer收割]程式設計練習賽49
A.相似顏色 每兩位列舉一下0~15,更新一下就好了。。 #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,a,b)
[Offer收割]程式設計練習賽79——字母去重
[Offer收割]程式設計練習賽79——字母去重 題目 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個字串S,每次操作你可以將其中任意一個字元修改成其他任意字元。 請你計算最少需要多少次操作,才能使得S中不存在兩個相鄰的相同字元。
hihoCoder [Offer收割]程式設計練習賽83 D 生成樹問題
題目 從 Kruskal 演算法的角度來思考這個問題。 考慮 $n$ 個點的“空圖”(即沒有邊的圖)。 先將 $m_2$ 條無權值的邊加到圖中,得到一個森林。 將 $m_1$ 條有權值的邊按權值從小到大排序。 列舉這些邊,對於邊 $e\colon(u, v, w)$,若將 $e$ 加入圖中之後 (i)
[Offer收割]程式設計練習賽84 -- 括號序列
時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個只包含'(', ')'和''的字串S,現在小Hi可以任意指定''為'('或')',不同的'*'可以是不同的字元。 請你判斷小Hi是否可能得到一個合法匹配的字串。 輸入 第一行包含一個整數T,代表資料的組數。 以
hihoCoder 1285 [Offer收割]程式設計練習賽3-3
[Offer收割]程式設計練習賽3——第3題 這次練習賽感覺比前兩次練習賽簡單一點,第1第2題就不說了。 #1285 : 智力競賽 時間限制: 5000ms 單點時限: 1000ms
[Offer收割]程式設計練習賽9 B題 水陸距離
題目2 : 水陸距離 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 給定一個N x M的01矩陣,其中1表示陸地,0表示水域。對於每一個位置,求出它距離最近的水域的距離是多少。 矩陣中每個位置與它上下左右相鄰的格
[Offer收割]程式設計練習賽2 hihocoder 1275 掃地機器人 (計算幾何+模擬 比較煩)
時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 小Ho最近買了一臺掃地機器人用來代替他清掃實驗室的衛生,掃地機器人有不同的尺寸,但是通常來說可以被視作一個M*M的正方形,掃地機器人僅能清掃被自己覆蓋過的區域。 小Ho所在的實驗室是一個
[Offer收割]程式設計練習賽56:卡片遊戲
#include<bits/stdc++.h> #include <assert.h> using namespace std; const int maxn = 1e5+11
[Offer收割]程式設計練習賽3
/** * ----------------------------------------------------------------- * Copyright (c) 2016 crazyacking.All rights reserved. * ---------------------------
hihocoder [Offer收割]程式設計練習賽19
題目1 : 大禮堂地毯 列舉 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std;
【Offer收割]程式設計練習賽15-題目1 : 偶像的條件】
【連結】:https://hihocoder.com/contest/offers15/problems 【題目描述】: 題目1 : 偶像的條件 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 小Hi的學校正面臨著廢
[Offer收割]程式設計練習賽4
#include <iostream> #include <string.h> #include <string> using namespace std; int main() { int n,x; int a[25]; cin >&
[Offer收割]程式設計練習賽27:題目2 : 兩個機器人
描述 一個N × M的2D迷宮中有兩個機器人。機器人A在迷宮左上角,只能向右或向下移動;機器人B在迷宮右下角,只能向左或向上移動。機器人不能移動到迷宮外。此外,由於奇怪的同步機制,這兩個機器人只能同時向相反的方向移動。也就是說或者機器人A向右同時機器人B向左;或者機器人A向下同時機器人B向上移動。 迷
[Offer收割]程式設計練習賽1 hihocoder 1270 建造基地 (完全揹包)
時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 在遙遠的未來,小Hi成為了地球聯邦外空間聯合開發工作組的一員,前往一顆新發現的星球開發當地的重金屬資源。 為了能
HiHoCoder #1270 : 建造基地 [Offer收割]程式設計練習賽1 【完全揹包】
描述 在遙遠的未來,小Hi成為了地球聯邦外空間聯合開發工作組的一員,前往一顆新發現的星球開發當地的重金屬資源。 為了能夠在當地生存下來,小Hi首先要建立一個基地。建立基地的材料可以直接使用當地的石材和富裕的重金屬資源。基地建設分為N級,每一級都需要達成K的建設值後才能夠完成建設,當前級別的建設值溢位後不會
九宮(DFS)——hiho [Offer收割]程式設計練習賽1
描述 小Hi最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1~9不重複的填入一個3*3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。 三階幻方又被稱作九宮格,在小學奧數裡有一句非常有名的口訣:“二四為肩,六八為足,左三右七,戴九履一,五居其中”,通過這樣
[Offer收割]程式設計練習賽79
題目 題目1: 題意: 給定一個字串S,每次操作你可以將其中任意一個字元修改成其他任意字元,請你計算最少需要多少次操作,才能使得S中不存在兩個相鄰的相同字元。 思路: 從第二個字元往後,如果字元相同ans+1。因為s[i]的改變會對s[i-1],s[i+1]都產
hihocoder1368即 [Offer收割]程式設計練習賽7第四題
hihocoder1368即 [Offer收割]程式設計練習賽7第四題: 積水的城市2 時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 提示:本題與“積水的城市”相比,資料範圍擴大了。 如下圖所示,某市市區由M條南
[Offer收割]程式設計練習賽29 題目1 : 逃離迷宮4
描述 小Hi被壞女巫抓進一座由無限多個格子組成的矩陣迷宮。 小Hi一開始處於迷宮(x, y)的位置,迷宮的出口在(a, b)。小Hi發現迷宮被女巫施加了魔法,假設當前他處在(x, y)的位置,那麼他只能移動到(x+y, y)或者(x, x+y)的位置上。 小Hi想知道自己能不能逃離迷宮。 輸入 第一行包
hihocoder1496 尋找最大值(offer收割程式設計練習賽12D)
題目大意:在1e5個數裡尋找兩個數a[i],a[j] ,(i!=j )使得 a[i] * a[j] * (a[i]&a[j]) 為最大值。 思路:對於a[i]&num,在a[i]的二進位制位下來說,不會使a[i]&num==0的應該