2018年EC Final 校内选拔赛【解题报告】
問題 A: C基礎(chǔ)-求同存異
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
提交:?1??解決:?1
[提交][狀態(tài)][討論版][命題人:外部導(dǎo)入][Edit] [TestData]
題目描述
輸入兩個(gè)數(shù)組(數(shù)組元素個(gè)數(shù)6和8),輸出在兩個(gè)數(shù)組中都出現(xiàn)的元素(如a[6]={234567}b[8]={357911131519}則輸出3、5、7)。
輸入
第一行輸入a數(shù)組,第二行輸入b數(shù)組
輸出
輸出在兩個(gè)數(shù)組中都出現(xiàn)的元素
樣例輸入
2 3 4 5 6 7 3 5 7 9 11 13 15 19樣例輸出
3 5 7 import java.util.*; import java.math.*;public class Main{static int maxn=(int)(5e4+10);public static void main(String[] args) {Scanner cin=new Scanner(System.in);LinkedList<Integer> a=new LinkedList<Integer>();ArrayList b=new ArrayList<Integer>();String A=cin.nextLine();int lenA=A.length();int num=0;for(int i=0;i<lenA;i++) {while(i<lenA) {num*=10;num+=(A.charAt(i)-'0');i++;if(i<lenA&&A.charAt(i)==' ') {a.add(num);num=0;break;}}}a.add(num);String B=cin.nextLine();int lenB=B.length();num=0;for(int i=0;i<lenB;i++) {while(i<lenB) {num*=10;num+=(B.charAt(i)-'0');i++;if(i<lenB&&B.charAt(i)==' ') {b.add(num);num=0;break;}}}b.add(num);ArrayList<Integer> ans=new ArrayList<Integer>();for(int i=0;i<a.size();i++) {boolean flag=false;for(int j=0;j<b.size();j++) {if(a.get(i)==b.get(j)) {ans.add(a.get(i));break;}}}for(int i=0;i<ans.size();i++) {System.out.println(ans.get(i));}cin.close();} }問題 B: C基礎(chǔ)-對角線和
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
提交:?2??解決:?2
[提交][狀態(tài)][討論版][命題人:外部導(dǎo)入][Edit] [TestData]
題目描述
求一個(gè)3×3矩陣對角線元素之和。
樣例輸入
1 2 3 4 5 6 7 8 9樣例輸出
15 import java.util.*; import java.math.*;public class Main{static int maxn=(int)(5e4+10);public static void main(String[] args) {Scanner cin=new Scanner(System.in);int ans=0;for(int i=1;i<=3;i++)for(int j=1;j<=3;j++) {int x=cin.nextInt();if(i==j) ans+=x;}System.out.println(ans); cin.close();} }問題 C: C基礎(chǔ)-局部求合
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
提交:?9??解決:?4
[提交][狀態(tài)][討論版][命題人:外部導(dǎo)入][Edit] [TestData]
題目描述
輸入20個(gè)整數(shù),輸出其中能被數(shù)組中其它元素整除的那些數(shù)組元素。
樣例輸入
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21樣例輸出
4 6 8 9 10 12 14 15 16 18 20 21 import java.util.*; import java.math.*;public class Main{static int maxn=(int)(5e4+10);public static void main(String[] args) {Scanner cin=new Scanner(System.in);ArrayList<Integer> a=new ArrayList<Integer>();ArrayList<Integer> ans=new ArrayList<Integer>();for(int i=0;i<20;i++) {int x=cin.nextInt();a.add(x);}//a.sort(null);for(int i=0;i<20;i++) {for(int j=0;j<20;j++) {if(i!=j&&a.get(i)%a.get(j)==0) {ans.add(a.get(i));break;}}}for(int i=0;i<ans.size();i++)System.out.println(ans.get(i));cin.close();} }?
問題 D: 楊輝三角
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
提交:?1??解決:?1
[提交][狀態(tài)][討論版][命題人:外部導(dǎo)入][Edit] [TestData]
題目描述
還記得中學(xué)時(shí)候?qū)W過的楊輝三角嗎?具體的定義這里不再描述,你可以參考以下的圖形:?
1?
1 1?
1 2 1?
1 3 3 1?
1 4 6 4 1?
1 5 10 10 5 1
輸入
輸入數(shù)據(jù)包含多個(gè)測試實(shí)例,每個(gè)測試實(shí)例的輸入只包含一個(gè)正整數(shù)n(1<=n<=30),表示將要輸出的楊輝三角的層數(shù)
輸出
對應(yīng)于每一個(gè)輸入,請輸出相應(yīng)層數(shù)的楊輝三角,每一層的整數(shù)之間用一個(gè)空格隔開,每一個(gè)楊輝三角后面加一個(gè)空行。
樣例輸入
2 3樣例輸出
1 1 11 1 1 1 2 1 import java.util.*; import java.math.*;public class Main{static int maxn=(int)(5e4+10);static long[][] f=new long[32][32];static void init() {f[1][1]=1;for(int i=2;i<=30;i++) {for(int j=1;j<=i;j++) {f[i][j]=f[i-1][j-1]+f[i-1][j];}}}public static void main(String[] args) {Scanner cin=new Scanner(System.in);init();int ca=1;while(cin.hasNext()) {int n=cin.nextInt();if(ca!=1)System.out.println();ca++;for(int i=1;i<=n;i++) {for(int j=1;j<=i;j++) {System.out.print(f[i][j]);if(i==j)System.out.println();elseSystem.out.print(" ");}}}cin.close();} }問題 E: Amon 愛游戲
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
提交:?1??解決:?1
[提交][狀態(tài)][討論版][命題人:winsoul][Edit] [TestData]
題目描述
Amon 非常喜歡和 Congcong 玩游戲。
現(xiàn)在有一堆含有 n 個(gè)石頭的石頭堆。
游戲規(guī)則如下:
????? ? 1. Amon先手。
????? ? 2. 兩人輪流取石頭,每次可以從石堆取出 1 ~ 3 個(gè)石頭。
????? ? 3. 第一個(gè)沒有石頭取的同學(xué)輸?shù)舯荣悺?/p>
Amon 很好奇,如果他們都用最優(yōu)策略來玩這個(gè)游戲,誰可以獲勝。
輸入
輸入包含多組測試數(shù)據(jù)。
對于每組測試樣例,輸入一個(gè)正整數(shù) n,表示石堆有 n 個(gè)石頭。(0 ≤ n ≤ 100000)。
輸出
對于每組測試輸出一行。
如果 Amon 贏得游戲,輸出“Amon!!!”。
否則輸出“Congcong!!!”。
樣例輸入
1 2 3 4樣例輸出
Amon!!! Amon!!! Amon!!! Congcong!!!四種博弈
巴什博弈:有N個(gè)物品,每次可以取1~M個(gè),最后取完者勝。
假設(shè)N=M+1,那么無論先手取多少個(gè),后者一次便可取完,先手必?cái)?/p>
假設(shè)N=(M+1)* R+S(R為任意自然數(shù),S<=M),那么先手拿走S個(gè)物品,后手拿走K個(gè)物品(K<=M),先手拿走M(jìn)+1-K個(gè)物品,剩余(M+1)*(R-1)個(gè)物品,保持這樣的取法,先手必勝。
勝利法則:若N%(M+1)不等于0,先手必勝
import java.util.*; import java.math.*;public class Main{static int maxn=(int)(5e4+10);public static void main(String[] args) {Scanner cin=new Scanner(System.in);int ca=1;while(cin.hasNext()) {int n=cin.nextInt();if(n%4!=0)System.out.println("Amon!!!");elseSystem.out.println("Congcong!!!");}cin.close();} }問題 F: 有趣的體能測試
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
提交:?2??解決:?2
[提交][狀態(tài)][討論版][命題人:201606060136][Edit] [TestData]
題目描述
“蒼天啊!為什么我一年比一年跑的慢,而體側(cè)及格線一年比一年高?”尤其是1000M,每次跑到懷疑人生!
為此,今年體育部出提出了一種新的體測項(xiàng)目:學(xué)生從出發(fā)點(diǎn)開始跑,必須經(jīng)過兩個(gè)傳感器,而且只能沿著南北方向和東西方向跑。
聰明的ACM選手,你知道怎樣跑最省力氣嗎?
輸入
本題包含多組測試,請?zhí)幚淼轿募Y(jié)束。
每組測試樣例,第一行為四個(gè)整數(shù),[x1,y1],[x2,y2],代表要經(jīng)過的兩個(gè)傳感器的坐標(biāo)。
為了簡化問題,出發(fā)點(diǎn)設(shè)為[0,0].
輸出
對于每組測試,輸出一個(gè)整數(shù),代表最短距離
樣例輸入
1 1 2 2樣例輸出
4提示
所有操作數(shù)在32bit整型數(shù)范圍內(nèi)
分析:
曼哈頓距離(或出租車距離)是1種使用在幾何度量空間的幾何學(xué)用語,用以標(biāo)明兩個(gè)點(diǎn)在標(biāo)準(zhǔn)坐標(biāo)系上的絕對軸距總和。
圖中紅線代表曼哈頓距離,綠色代表歐氏距離,也就是直線距離,而藍(lán)色和黃色代表等價(jià)的曼哈頓距離。
曼哈頓距離——兩點(diǎn)在南北方向上的距離,加上在東西方向上的距離
例如在平面上,坐標(biāo)(x1, y1)的i點(diǎn)與坐標(biāo)(x2, y2)的j點(diǎn)的曼哈頓距離為:
d(i,j)=|X1-X2|+|Y1-Y2|.
既然必須經(jīng)過兩個(gè)點(diǎn),那么只有兩種可能【原點(diǎn)->1號點(diǎn)->2號點(diǎn)】或者【原點(diǎn)->2號點(diǎn)->1號點(diǎn)】
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <map> #include <vector> #include <set> #include <string> #include <math.h>using namespace std; const double eps = 1e-8; const int maxn=2e5+10;int main() {int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);int ans1=abs(x1)+abs(y1)+abs(x2-x1)+abs(y2-y1);int ans2=abs(x2)+abs(y2)+abs(x1-x2)+abs(y1-y2);printf("%d\n",min(ans1,ans2)); }問題 G: 圖書管理
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
提交:?22??解決:?6
[提交][狀態(tài)][討論版][命題人:201606060136]
題目描述
小虎參加陜西科技大學(xué)青年志愿者服務(wù)團(tuán),經(jīng)常去做志愿活動,其中一項(xiàng)就是在圖書館幫忙整理書籍。
小虎的工作很簡單,就是把圖書分類放到書架上。比如,現(xiàn)在有一摞書【1,2,3】,(為了簡化問題,我們把書編號為1,2,3.....)
1號書在最上面,書架上需要把按【2,1,3】整理擺放。第一次小虎取2號書時(shí),他會把【1,2】兩本書放到書架上;第二次需要1號書時(shí),
1號書已經(jīng)在書架上啦;第三次,他會把3號書放到書架上
輸入
第一行一個(gè)整數(shù)T,表示有T組數(shù)據(jù)。?
每組數(shù)據(jù)第一行一個(gè)正整數(shù)N(N<=2*10^5)表示有N本書
接下來有N個(gè)正整數(shù),a1,a2,a3....an,代表一摞書,a1號書在最上面(1<=ai<=N)
接下來N個(gè)正數(shù),b1,b2,b3....bn,代表N本書在書架上擺放的順序(1<=bi<=N)
輸出
對于每組測試樣例,輸出N個(gè)數(shù),代表每次取書的數(shù)量。
樣例輸入
2 3 1 2 3 2 1 3 5 1 2 3 4 5 1 2 3 4 5樣例輸出
2 0 1 1 1 1 1 1提示
對于第一個(gè)樣例,小虎一共取了三次書,第一次取2本,第二次取0本,第三次取1本,輸出【2? 0? 1】
分析:
根據(jù)題意,每次只能從一摞書的上面取走連續(xù)的K本書,那么考慮使用一個(gè)棧來解決先進(jìn)后出的問題,比如,現(xiàn)在有一摞書【1,2,3】,1號書在最上面,即棧頂元素;書架上需要把按【2,1,3】整理擺放。第一次小虎取2號書時(shí),他會把【1,2】兩本書放到書架上,即先彈出1,然后彈出2;第二次需要1號書時(shí),1號書已經(jīng)在書架上啦;第三次,他會把3號書放到書架上,把彈出3;每次記錄一下出棧元素個(gè)數(shù)即可
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <set> #include <map> #include <vector> #include <string> #include <math.h>using namespace std; const double eps = 1e-8; const int maxn=2e5+10; int a[maxn],b[maxn]; bool vis[maxn]; int ans[maxn]; int main() {//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int j=1;j<=n;j++)scanf("%d",&b[j]);memset(ans,0,sizeof ans);memset(vis,0,sizeof vis);int top=1;for(int i=1;i<=n;i++){if(vis[b[i]]){ans[i]=0;continue;}int num=0;while(top<=n){int cur=a[top++];vis[cur]=1;num++;if(cur==b[i])break;}ans[i]=num;}for(int i=1;i<=n;i++)printf("%d%c",ans[i],i==n?'\n':' ');}return 0; }問題 H: 電音之王
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
提交:?3??解決:?1
[提交][狀態(tài)][討論版][命題人:201606060136][Edit] [TestData]
題目描述
終于活成了自己討厭的樣子。
聽說多聽電音能加快程序運(yùn)行的速度。
小娜打了四年ACM,獲獎無數(shù),畢業(yè)之后進(jìn)入TX公司,成為一名算法工程師。他所在的團(tuán)隊(duì)負(fù)責(zé)應(yīng)用程序的底層架構(gòu)開發(fā)。
團(tuán)隊(duì)中每個(gè)程序員都有幾個(gè)朋友,當(dāng)然自己和自己不算朋友,因?yàn)閾碛信笥?#xff0c;會獲得一定的快樂值。比如,現(xiàn)在團(tuán)隊(duì)中有3個(gè)人,
如果一個(gè)程序員有1個(gè)朋友,那么他的快樂值為2;如果一個(gè)程序員有2個(gè)朋友,那么他的快樂值為1.團(tuán)隊(duì)的快樂值就是團(tuán)隊(duì)中
所有程序員的快樂值之和,團(tuán)隊(duì)快樂值越大,工作效率越高。齊老板想知道團(tuán)隊(duì)快樂值最大是多少?
輸入
首先是一個(gè)整數(shù)T,代表有T組測試樣例。
對于每組測試樣例,第一行是一個(gè)數(shù)N,代表團(tuán)隊(duì)中有N個(gè)人(N<=1000000)
第二行是N-1個(gè)數(shù),a1,a2,a3,a4.......(<=100000000).,a1代表程序員有一個(gè)朋友時(shí)的快樂值,
a2代表程序員有兩個(gè)朋友時(shí)的快樂值,以此類推
輸出
對于每組測試樣例,輸出團(tuán)隊(duì)最大的快樂值
樣例輸入
1 3 2 1樣例輸出
5分析:
團(tuán)隊(duì)中有N個(gè)人,如果兩個(gè)是朋友,就建一條邊;顯然一個(gè)人最多N-1個(gè)朋友,自己和自己不算朋友(說明沒有自環(huán)),每個(gè)人至少一個(gè)朋友(說明圖是連通圖);
這樣n個(gè)點(diǎn)構(gòu)成一棵樹,有n-1條邊,一共是2*n-2個(gè)度,而且確定的一點(diǎn)是每一個(gè)點(diǎn)都至少有1個(gè)度。這樣還剩下n-2個(gè)度。問題就轉(zhuǎn)化成了n-2個(gè)度分給n個(gè)點(diǎn)(每個(gè)點(diǎn)擁有的度數(shù)可以是0)。
但是題目給了n-1個(gè)f(i)意思就是說,有n-1種物品,每一種物品的種類都是無限的(因?yàn)槊總€(gè)點(diǎn)的度數(shù)是可以相同的),并且每件物品的價(jià)值都是v【i】=1,并且每件物品的體積(重量)都是i(就是這個(gè)物品的度數(shù)),然后把這n-1種物品,正好裝入一個(gè)容量為n-2的背包里
但是這道題還有個(gè)坑,就是我們默認(rèn)了每個(gè)點(diǎn)都有了一個(gè)度了,所以實(shí)際上我們在枚舉物品的時(shí)候,他們的度都是i+1(假設(shè)從1開始循環(huán))
import java.math.*; import java.util.*; public class Main {static int maxn=2020;static int INF=(int)1e9;static int n,v;static int[] f=new int[maxn];static int[] dp=new int[maxn];static void DP() {for(int i=1;i<=n;i++)dp[i]=-INF;//求恰好裝滿背包時(shí)的最優(yōu)解,初始化為—INFdp[0]=0;//背包容量為0,價(jià)值為0v=n-2;//背包容量for(int i=1;i<=n-1;i++)//枚舉物品for(int j=i;j<=v;j++)//枚舉背包容量dp[j]=Math.max(dp[j], dp[j-i]+f[i+1]-f[1]);//狀態(tài)轉(zhuǎn)移方程}public static void main (String[] args) {Scanner cin=new Scanner(System.in);int T=cin.nextInt();while((T--)!=0) {n=cin.nextInt();for(int i=1;i<=n-1;i++)f[i]=cin.nextInt();DP();System.out.println(dp[v]+f[1]*n);}cin.close();}}問題 I: 模擬人生:大學(xué)生活
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
提交:?7??解決:?3
[提交][狀態(tài)][討論版][命題人:winsoul][Edit] [TestData]
題目描述
? ? ? ? ? ? 如果不喜歡編程,學(xué)習(xí)算法 和 學(xué)習(xí)高數(shù)有什么不同?? —— 渣渣輝
小虎很喜歡《模擬人生:大學(xué)生活》這款游戲,因?yàn)樾』⒖梢栽谶@款游戲中控制虛擬角色做任何事情。
這款游戲講述的是一個(gè)主人公在大學(xué)里面的生活。
小虎非常喜歡算法,當(dāng)然在游戲中也不例外。他說:“大學(xué)里,只有算法伴我左右。”。
于是他在游戲中利用他的虛擬角色在學(xué)校學(xué)習(xí)了各種各樣的算法,并發(fā)明了 KHP 算法登上了?Time'? 封面。
KHP 算法是這樣描述的:
? ??????? ? 1. 給定一個(gè)長度為 n 的非負(fù)整數(shù)序列 a ,和長度同為 n 的序列 b。( 0 <= ai?<= 109,1 <= bi?<= n)
????????? ? 2. 你可以找出符合條件的 an+1,an+2,...,a2n,使得??最大。
找出 an,an+1,...,a2n?的方法如下:
????????? ? 1. 對于每一個(gè) ai?,你需要在 b 序列中選擇一個(gè) bk?( b 中每個(gè)元素最多只能選一次)。
????????????2.? ai?= max{ aj?- j | bk?≤ j < i}。
請你計(jì)算出。
輸入
輸入包含多組測試數(shù)據(jù)。
對于每組測試數(shù)據(jù):
第一行輸入為正整數(shù) n,表示序列 a、b 的長度。(1 ≤ n ≤ 2*105)
第二行輸入為 n 個(gè)非負(fù)整數(shù),為序列 a 的元素。
第三行輸入為 n 個(gè)正整數(shù),為序列 b 的元素。
mod: 1000000007
輸出
對于每組測試數(shù)據(jù),輸出的結(jié)果,占一行。
樣例輸入
4 8 11 8 5 3 1 4 2樣例輸出
59 #include <bits/stdc++.h> using namespace std; const int maxn = 400010; const int mod = 1000000007; long long int a[maxn], b[maxn], segtree[maxn << 4];void build_tree(int l, int r, int now) {if (l == r) {segtree[now] = a[l] - l;return;}int mid = l + (r - l)/2;build_tree(l, mid, now << 1);build_tree(mid + 1, r, (now << 1)|1);segtree[now] = max(segtree[now << 1], segtree[(now << 1)|1]); }long long int query(int L, int R, int l, int r, int now) {if (L <= l && R >= r) {return segtree[now];}long long int ans = 0;int mid = l + (r - l)/2;if (L <= mid) ans = max(ans, query(L, R, l, mid, now << 1));if (R > mid) ans = max(ans, query(L, R, mid + 1, r, (now << 1)|1));return ans; }void update(int l, int r, int tar, int c, int now) {if (l == r) {segtree[now] = c;return;}int mid = l + (r - l)/2;if (tar <= mid) update(l, mid, tar, c, now << 1);else update(mid + 1, r, tar, c, (now << 1)|1);segtree[now] = max(segtree[now << 1], segtree[(now << 1)|1]); }int main() {int n;while (scanf("%d", &n) != EOF) {memset(segtree, 0, sizeof segtree);memset(a, 0, sizeof a);memset(b, 0, sizeof b);long long int ans = 0;for (int i = 1; i <= n; i++) {scanf("%lld", &a[i]);ans += a[i]%mod;}for (int i = 1; i <= n; i++) {scanf("%lld", &b[i]);}sort(b + 1, b + n + 1);build_tree(1, 2*n, 1);for (int i = 1; i <= n; i++) {long long int ai = query(b[i], n + i - 1, 1, 2*n, 1);ans += ai%mod;update(1, 2*n, n + i, ai - n - i, 1);}printf("%lld\n", ans%mod);}return 0; }?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的2018年EC Final 校内选拔赛【解题报告】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++结构体多级排序的三种方法
- 下一篇: HDU1525 Euclid's Gam