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個人所需的時間 用優先佇列用優先佇列用優先佇列 佇列用來存每個水龍頭所需要的總時間,到了最後用了最少時間的水龍頭就是第...