清北學堂 2017 10 01

2021-08-08 23:08:19 字數 4568 閱讀 8888

problem 1. alien

input file: alien.in

output file: alien.out

time limit: 1s

memory limit: 128m

小y 最近正在接受來自x3 星球的外星人的採訪。在那個星球上,每個人的名字都是乙個正整數。

所有在這個星球上的居民都是相互認識的。兩個這個星球上的人的友誼值可以⽤這樣來計算: 先把兩個人

的名字轉換成二進位制,然後把他們上下對齊排好,如果同一列的值相等,那麼相應列的值就是0,否則的

話就是1,結果最後仍舊轉換成十進位制數。(即xor 操作)

例如,兩個人的名字是19 和10,他們的友誼值是25

這個星球的價值是這麼計算的: 所有友情值的和。小y 邀請你幫助他來計算這個值。

input

輸入檔案第一行乙個整數n, 表示這個星球上的總人數。

接下來n 行,每行乙個正整數,表示每個居民的姓名。

output

輸出檔案一行個整數,表示這個星球的價值。

example

alien1.in 2

19 10

alien1.out 25

alien2.in 3

7 35

alien2.out 12

alien3.in 5

9 13

1 96

alien3.out 84

scoring

• 對於40% 的資料,n<=5000。

• 對於70% 的資料,n<=100000。

• 對於100% 的資料,n<=1e6, 每個居民的姓名小於1e6。

解析:

大概就是每兩個數按位或一下

but我沒看懂標程

#include

#include

#include

using namespace std;

long long n,name[1000005];

long long sum;

int main()

if (j>k) k=j; } for (i=k;i>=1;--i) ans=ans*2+a[i]*(n-a[i]); cout<

problem 2. polyline

input file: polyline.in

output file: polyline.out

time limit: 1s

memory limit: 128m

有若干個類似於下面的函式:

定義n 個函式y1(x); :::; yn(x) 的對於任意x 的總和s(x) = y1(x) + ::: + yn(x),很容易發現s(x) 的

圖象是多段線組成。給你n 個函式,你的任務是找出s(x) 圖象不等於180 度的角的個數。

input

第一行乙個整數n,表示函式的個數。

接下來n行, 每行包含兩個空格隔開的整數ki; bi, 表示第i 個函式的引數。

output

輸出一行乙個整數, 表示形成的多段線的影象中不等於180 度角的個數。

example

polyline1.in

1 1 0

polyline1.out

1 polyline2.in

3 1 0

0 2-1 1

polyline2.out

2 polyline3.in

3 -2 -4

1 7-5 1

polyline3.out

3 scoring

• 對於30% 的資料,n<=3000。

• 對於100% 的資料,1<=n<=1e5;-1e9<=ki; bi<=1e9。

解析:影象只有x軸上半部分的影象

就是算一下斜率,看看與x軸夾角是否為180°

k==0的不起作用,可忽略不計

由於交點橫座標可能無法整除,因此可以

1.全部求完後判斷差值是否<=1e-18,如果是,則ans--

2.讓k、b分開存,約到最簡比,然後看是否相同

#include#include#includeusing namespace std;

int n,cnt=0;

int k[100005],b[100005];

long double p[100005];

int main()

} sort(p+1,p+1+n);

int ans=cnt;

for(int i=1;i<=cnt;i++)

if(p[i]-p[i-1]<=-1e18) ans--;

printf("%d",ans);

return 0;

}

problem 3. roadwork

input file: roadwork.in

output file: roadwork.out

time limit: 1s

memory limit: 512m

現在有一條單個車道的路,兩邊會不斷有車來,任意時刻路上只能有乙個方向的車,每輛車速度相

同,同一方向的車必須在前⼀輛車上路3 秒後才能上路,可以在路⼜等待,不能超車,每個人在路口等

過其忍受範圍後便會不高興,現在請你安排過路順序,使得不高興的人數最少。

input

第一行兩個整數t 和n,代表有n 輛車,每輛車過橋時間為t 秒

下面n行,述每輛車,每行乙個字元c,兩個數字a 和r;

c=「e」或「w」代表方向,a 代表到達時間(秒),r 代表最示忍受時間(秒,上路時間- a),按到來順序

給出,a 相同時以到來順序為準。

output

輸出一行乙個整數,代表最少發怒人數。

example

roadwork1.in

8 3w 10 0

w 10 3

e 17 4

roadwork1.out

roadwork2.in

100 5

w 0 200

w 5 201

e 95 1111

e 95 1

e 95 11

roadwork2.out

1 scoring

• 對於100% 的資料,4<=t<=180; 1=

解析:一道dp題

// solution of problem road work

// time complexity: o(n^3)

// space complexity: o(n^3)

// author: fredrik svensson

f[i][j][k][0/1]

temp=f[i][j][k][0/1]

f[i+1][j][tk][0]=temp+3;

if(temp+3<=r[i+1])

tk=k;

else tk=k+1;

f[i][j+1][tk][0]=temp+t;

if(temp+t<=r[i+1])

tk=k;

else tk=k+1;

#include #include #include #include #include using namespace std;

#define max_n 350

int resetvalue = 123*max_n;

const int maxtotaltime = 86400+max_n*3+2*max_n*180;

struct car

;vectortowest;

vectortoeast;

int timetopass;

int dp[max_n+1][max_n+1][max_n+1][2]; // totaltime = dp[driveneast][drivenwest][numirritated][lasttowest=0,lasttoeast=1]

int calc(int drivenwest, int driveneast, int numirritated, int lasttoeast)

if (dpv < maxtotaltime)

dpv = max(mycar.arrival, dpv);

} }return dpv;

}int main()

// dynamic programming

// reset

memset(&dp[0][0][0][0], 0x7f7f7f7f, sizeof(dp));

dp[0][0][0][0] = dp[0][0][0][1] = -3;//???

// run

int numirritated;

for (numirritated = 0; numirritated <= n; ++numirritated)

cout << numirritated << endl;

return 0;

}

清北學堂 2017 10 06

因為是剛聽完課所以想把思路記下來,有一些其實也是一知半解的,如果有dalao可以幫忙講解那真是再感謝不過了。還有為什麼我畫圖這麼醜,哇的一下哭出聲 problem a.最佳進製 如今我們最常用的是十進位制,據說這是因為人有十根手指。但事實上這並不是十分方便,10 只有四個因子 1 2 5 10,像 ...

清北學堂 Pa

pa 題目描述 漢諾塔公升級了 現在我們有?個圓盤和?個柱子,每個圓盤大小都不一樣,大的圓盤不能放在小的圓盤上面,個柱子從左到右排成一排。每次你可以將一 個柱子上的最上面的圓盤移動到右邊或者左邊的柱子上 如果移動之後是合法的 話 現在告訴你初始時的狀態,你希望用最少的步數將第?大的盤子移動到第?根 ...

清北學堂 死亡(death)

m個位置可以打sif,n 1個人等著打sif,已知前n個人的時間,問第n 1個人什麼時候才能打sif 不能插隊,即必須按順序來打sif 輸入n,m以及每個人所需要的時間 輸出第n 1個人所需的時間 用優先佇列用優先佇列用優先佇列 佇列用來存每個水龍頭所需要的總時間,到了最後用了最少時間的水龍頭就是第...