一共四道題
#題目1 : 互補二元組
時間限制:10000ms
單點時限:1000ms
記憶體限制:256mb
描述給定n個整數二元組(x1, y1), (x2, y2), … (xn, yn)。
請你計算其中有多少對二元組(xi, yi)和(xj, yj)滿足xi + xj = yi + yj且i < j。
輸入第一行包含乙個整數n。
以下n行每行兩個整數xi和yi。
對於70%的資料,1 ≤ n ≤ 1000
對於100%的資料,1 ≤ n ≤ 100000 -1000000 ≤ xi, yi ≤ 1000000
輸出乙個整數表示答案。
樣例輸入
59 10
1 35 5
5 48 6
樣例輸出
2最初看到這道題的時候沒有認真審題,認為(1,2)(3,2)(3,2)這種情況只計數一次(應該記兩次),想辦法將配過對的陣列刪除,結果耽誤了很長時間,後來先做的後面幾題,快結束時返回來再直接按字面意思做,過了70%(lte)。比賽結束後翻到了某大神簡潔的**,膜拜。這道題將給定的條件xi + xj = yi + yj稍微變換一下可得 (xi -yi)+ (xj - yj) = 0, 所以將輸入的數對作差值儲存起來即可。考慮到x、y的取值範圍,可用map直接查詢。嗯,以上的都能想到。大神的方法妙在儲存x-y時,直接對y-x做加操作,省去了重複遍歷和查詢,很巧妙。(注意x,y的取值範圍,ll)
**:
#include#include#include#include#includetypedef long long ll;
using namespace std;
mapres;
int main()
cout << cnt << endl;
return 0;
}
#題目2 : 尋找切線
時間限制:10000ms
單點時限:1000ms
記憶體限制:256mb
描述給定平面上n個點p1=(x1, y1), p2=(x2, y2), … pn=(xn, yn)。
請你從中找到兩個不同的點pi和pj滿足:其他所有點都在pi和pj連線的同一側(可以在連線上)。
如果有多組答案滿足條件,你可以輸出任意一組。
輸入第一行包含乙個整數n。
以下n行每行包含兩個整數xi和yi。
對於50%的資料,1 ≤ n ≤ 1000
對於100%的資料,1 ≤ n ≤ 100000 0 ≤ xi, yi ≤ 1000000
輸出輸出由乙個空格隔開的兩個整數i和j,注意1 ≤ i, j ≤ n且i ≠ j。
樣例輸入
60 10
7 08 8
10 18
15 13
20 4
樣例輸出
5 6方法:一條直線由兩點確定:先找到 x/y 座標最大值(最小值也可以)作為第乙個點,再計算其餘點與該點的斜率,取絕對值最大的點作為第二個點。
#include#include#include#include#include#include#include#includeusing namespace std;
int main()
float k = 0;
for(int i=0; ik)
}if(m < q) cout << m+1 << ' ' << q+1 << endl;
else cout << q+1 << ' ' << m+1 << endl;
return 0;
}
#題目3 : lr問題
時間限制:10000ms
單點時限:1000ms
記憶體限制:256mb
描述給定兩個字串s和t,每個字串都由』l』、『r』和』_'組成。例如:
r__lr_r_l
每一次操作,可以將s中的乙個』r』與它右邊相鄰的』『交換(前提是這個r右邊相鄰位置就是』』);或者將s中的乙個』l』與它左邊相鄰的』『交換(前提是這個l左邊相鄰位置就是』』)。
例如,先移動第乙個l,再移動第二個r會得到:
r__lr_r_l -> r_l_r_r_l -> r_l__rr_l
請你計算最少經過幾次操作可以將s變成t。
輸入第一行包含乙個字串s。
第二行包含乙個字串t。
對於30%的資料,1 ≤ |s| = |t| ≤ 20
對於100%的資料,1 ≤ |s| = |t| ≤ 100000
輸出輸出乙個整數代表最少操作次數。
如果不論如何s也不能變成t,輸出-1。
樣例輸入
r__lr_r_l
r_l__rr_l
樣例輸出
2總是把簡單問題複雜化,竟然想用dp,做的題量還是太少了。參照某大神簡潔優美的**如下:
#include #include using namespace std;
int main()
void union(int x, int y)
int vis[maxn];
vectorg[maxn];
void dfs(int x)
}bool check(int mid)
for(int i = 1; i <= n; i++) vis[i] = 0;
vis[find(1)] = 1;
dfs(find(1));
if(vis[find(n)]) return true;
for(int i = 1; i <= n; i++) vis[i] = 0;
vis[find(n)] = 1;
dfs(find(n));
if(vis[find(1)]) return true;
return false;
}int id(char * s)
int main(void)
if(!check(m)) puts("-1");
else
printf("%d\n", r);
}return 0;
}
hihoCoder程式設計練習賽69
時間限制 5000ms 單點時限 1000ms 記憶體限制 256mb 給定乙個小寫字母字串,請判斷它是否有長度為偶數的非空連續回文子串 輸入包含多組資料。每組資料報含一行乙個小寫字母字串 s 1 s 105 對於每組資料如果存在,輸出yes,否則輸出no 樣例輸入 cabbad ababa 樣例輸...
hihoCoder程式設計練習賽11 物品價值
描述 小hi現在有n個物品,每個物品都有乙個價值。並且這n個物品總共有m個不同的屬性,每個物品都具有其中若干屬性。小ho要從中選出若干物品,滿足每個屬性都正好有奇數個物品擁有,且被選出的物品價值總和最大。你能幫助小ho完成任務麼?輸入 第一行乙個數t 10 表示資料組數。對於每一組資料 第一行兩個數...
hihocoder 程式設計練習賽59第三題樹的權重
題目 其實就是乙個樹的轉移中心的題。以1為根節點做一遍dfs可以得到1到其他所有點 的距離之和。求某點到其他點的距離之和的時候可以根據最初的情況轉移。比如設點k是點1的子節點,w k w 1 cnt k n cnt k 其中cnt k 是k的子樹的節點個數 包括k本身 當根節點由乙個點轉移到它的子節...