2016大數據研究中心夏令營上機考試
2016年北京大學計算機科學技術研究所優秀大學生夏令營上機考試
12推免
- 石頭剪刀布
- 最簡真分數
include<algorithm>
__gcd(a,b);
- encode decode 字符串的處理
- 大數,進制轉換,
unsolved
- 8數碼問題,和之前做的BFS不同的是,要存儲每一種可能的系統狀態
struct Node
{
int s[9];
int loc;//“0”的位置,把“x"當0
int status;//康拖展開的hash值
string path;//路徑 更新:next.path=next.path+indexs[i];
};
- 熱血格斗場 和冷血格斗場要求不一樣
- 畫家問題 重復題
不能用BFS
- 三角形 重復題,從下往上
- Lausanne Capitale Olympique
no answer
13推免(校外)
- 十進制轉六進制,無oj
- 電池的壽命,找規律
令最大壽命為x,其余壽命和為sum,若sum>x,則可以全部用完 ans=(sum+x)/2
否則 只能用sum的壽命
if(2*x[n-1]>ans)
ans-=x[n-1];
else ans*=0.5;
- 重建二叉樹
typedef struct node
- 完美覆蓋,遞推關系的尋找
f(n)=3f(n-2)+2[f(n-4)+...f(0)]
f(n-2)=3f(n-4)+2[f(n-6)+...f(0)]
thus: f(n)=4f(n-2)-f(n-4)
f(0)=1, f(2)=3;
- 去掉冗余的括號,兩個標準:括號前是否是負號、括號里面是否有操作符號
- 坦克大戰,
done
- sightseeing,混合圖歐拉路徑的判定
...
- poyla計數,項鏈涂色問題
//背代碼
(long long)(pow(3.0,tmp*1.0));//格式為long long,3.0
13推免(校內)
- 字符串插入,沒有說怎么結尾,讀入方式就是:
while(cin>>a>>b)
- 書架,臨界條件
sum>=b
- 最長子序列,動態規劃
if(a[j]<a[i]&&b[j]+1>b[i])
b[i]=b[j]+1;//b[i]從1開始
- 尋找正方形
變量和復雜度都會影響運行時間
//先排序再查找
void *bsearch(const void *key, const void *base, size_t nmem, size_t size, int (*comp)(const void *, const void *));
eg. (point_type*) bsearch ((const void*) key...)
//key指向所要查找的元素,base指向進行查找的數組
//nmem為查找長度,一般為數組長度
//size為每個元素所占的字節數,一般用sizeof(...)表示,comp指向比較子函數
int compare(const void* e1,const void* e2)
{
const point_type* p1=(const point_type*) e1;
const point_type* p2=(const point_type*) e2;
if (p1->x!=p2->x)//先比較x
return p1->x-p2->x;
else//x相同就比較y
return p1->y-p2->y;
}
//cmp的寫法
qsort(p,n,sizeof(point_type),compare);
//qsort寫法
key->x=x2+y1-y2;
key->y=y2+x2-x1;
//只往一個方向上找,
13夏令營
- 水
- map,冷血格斗場
輸入的id沒有從小大的順序
- 上臺階,斐波那契數列
- 線段樹,二分,
數字大的用scanf否則易超時!
POJ3264
#include<algorithm> max(a,b);
struct node//用來記錄每個葉結點,之所以不用指針是因為用tree[num]來記錄每個結點了(樹不需要動態操作所以可以這么用)
{
int l;
int r;
int max;
int min;
};
//用全局變量來記錄最大值
int findmax(int l,int r,int ceng)//層是tree[num]的編號
- 數獨,DFS,用
grid[num][1-9]
來標記是否已經用了這個數字 POJ2676 - 3D迷宮BFS
- 數字三角形,遞歸。
if(map[i+1][j]>map[i+1][j+1])
map[i][j]=map[i+1][j]+map[i][j];
else
map[i][j]=map[i+1][j+1]+map[i][j];
- 最小生成樹
上下限的設置
- 增廣方法求最大流 POJ1273
map和min_flow是全局變量,pre和flow在尋找每一條增廣路徑時更新,
14推免
- 單詞倒排
- DNA排序,struct,qsort,count
- 踩方格,DFS深度優先,回溯
- 走迷宮找最短路徑,BFS廣度優先
- 二維背包問題
for(i=0;i<c;i++)
{
cin>>temp1>>temp2;
for(j=a;j>=temp1;j--)
{
for(k=b;k>=temp2;k--)
{
if(dp[j][k]<dp[j-temp1][k-temp2]+1)
dp[j][k]=dp[j-temp1][k-temp2]+1;//個數+1
}
}
//dp:精靈球數量,體力值——小精靈的個數
}
- 套匯,Floyed
map<string,int>STL;
dist[i][i]=1; //自己到自己初始為1
dist[i][j] < dist[i][k] * dist[k][j];//更新條件
- trie樹,對樹的操作:
void clean ()
root->next[i]=NULL;
void delete(root)
{
if(root->next[i])
delete(root->next[i]);
free(root);
}
pnode p1= (pnode)malloc(sizeof(node));//生成結點
typedef struct node//結構定義
{
struct node *next[10];//0~9
int end,cover;
}*pnode;
14夏令營
- 人民幣支付,水
- 排隊游戲,類似POJ對括號的處理
輸入不一定是()!!!
- 取石子游戲,
巨坑!要么用a/b>=2, 要么用long long a,b;
- 去除注釋,
cin.getline(s,200)
之后對字符的處理、多種情況的考慮沒有測試
- 求逆序數對即是求歸并排序的交換次數,背代碼
- 坦克大戰,BFS的處理
map越界!
- 背包問題,
d[j]=max(d[j-a]+b,d[j])//j是背包可承受的最大重量,注意上限!
- 樹的處理,找規律
- 寶昌縣長要修路,最小生成樹的編寫,雙邊距離
15推免
- 水
- 矩陣轉置
- 行程編碼
- 去除重復的數
- 分解因數,遞歸:
if(a==1) return 1;
if(b==1) return 0;
if(a%b==0) return func(a/b,b)+func(a,b-1)
else return func(a,b-1)
- DFS 深度優先
- 背包問題
64-bit unsigned integer:%I64d
dp[0]=1;
for (i=1; i<=num; i++)//對于從小到大的序號
for (j=n; j>=0; j--)
for (x=1; x<=h[i]; x++)//這個數有多少個
if (j-x>=0)
dp[j]+=dp[j-x];
- 查找二叉樹;得到一行中不確定個數的數字
輸入有可能是0
while((c=getchar())!='\n')
{
if(c>='0'&&c<='9')
{
ungetc(c,stdin);
cin>>a[i++];
}
} - Floyd,找兩點之間所要經過的最小“最大距離”。
for(k=1; k<=n; k++)
for(i=1; i<=n-1; i++)
for(j=i+1; j<=n; j++)
if(path[i][k]<path[i][j] && path[k][j]<path[i][j])
//則走i->k->j路線,否則走i->j路線
if(path[i][k]<path[k][j])
path[i][j]=path[j][i]=path[k][j];
else
path[i][j]=path[j][i]=path[i][k];
15夏令營
- 水
- 水
- 數組的遍歷
考慮只有一行的情況!
- qsort不能有兩個cmp方法,合影
- 相同字符串的尋找,題意的理解
- To Europe,動態規劃!:
t=l*1.0/s+result[j-1];//int變double,考慮到每一層的最優情況
BFS,考慮的是方向不是距離
相鄰的點可以到達
用普通的BFS不行,因為即使當前的點是segment最少的點,也不能保證接下來找到點是segment最少的。
從原點開始,把1步、2步…能走到的點都放進隊里。
而不是只找可以走到的一個點
審題!
每一個輸入之后有一個空行memset(v,0,sizeof(v));
二叉查找樹的建立
兩點之間的最短距離
16推免(check)
- 石頭剪刀布
- 字符串判斷,
'a'-'A'=32
極值Z的處理
- 矩陣輸出順序
- DFS,背代碼,遞歸的利用
不是可能性!是數獨的要求!
- 10000個數的計算,不能直接計算,而是每次計算都取余數,類似背包問題用0、1存結果
1. %的結果可能是負的!
2. 不管是+a[i]還是-a[i]都可能出現mod是負的!
3. 動態規劃,用dp[10001][101]存儲!
- 畫家問題,和POJ的題不一樣,不能簡單的枚舉否則會超時。
for(int k=0; k<pow(2.0, n); k++)
getLine(k);
void getLine(int k)
{
//通過二進制枚舉第一行可能發生的所有情況
int j = n;
while(j>0)
{
line[j] = k % 2;//line[j]代表第一行的第j列翻轉
k /= 2;
j--;
}
}
- 最小生成樹、字符串的處理
not by me
string temp1;
if(temp1.compare(a[j])==0)
- 二叉樹路線的計算
not by me
- Magical GCD的理解
動態規劃,gcd函數要自己寫
16夏令營
- 水
- 單詞翻轉,調試
- 加密,矩陣的操作
- 文件結構圖,目錄里的文件也要排序,因此一定要用遞歸
recur(string s1,int N,int T) //T是test的序號,N是文件層次的序號
- 匯率計算,精度的改變,用兩個數組決定換不換
double update(double a)
{
a=a*100;
int y=int(a);
return y/100.0;
}
- BFS,迷宮,背代碼
- 前序遍歷、中序遍歷變為后序遍歷。讀取一行的兩個字符串
cin>>s1>>s2
- 最小生成樹
- 多米諾,f[i][j]為枚舉到第i個數差為j時最少交換了多少次,要考慮j為負數的情況。
f[i][j]=min(f[i][j],f[i-1][j-(a[i]-b[i])],f[i-1][j+(a[i]-b[i])]+1)