北京化工大學2018年10月程式設計競賽部分題解(A,C,E,H)

來源:互聯網
上載者:User

標籤:import   2018年   初始   區間   個數   背包問題   時間長度   北京   []   

目錄

  • 北京化工大學2018年10月程式設計競賽部分題解(A,C,E,H)
    • 競賽事件相關
      • 競賽連結
      • 競賽題目
      • 總結
北京化工大學2018年10月程式設計競賽部分題解(A,C,E,H)競賽事件相關競賽連結

雖然我發這個隨筆的時候估計已經比完了,不過還是把連結放上來好了。

一個比賽

http://116.196.97.99/contest.php如果連結沒設定好的話,可以在這裡複製網址
競賽題目我做出來的C.水題的ZZH題目描述

ZZH是北化acm界新生代的大佬,每天會和無數來自全球各地的大佬進行交流。但是,ZZH每天水群的時間有限。ZZH想儘可能多的和更強的大佬進行交流。他把每個大佬的實力用一個數字Ω表示出來,並且每天和Ω總和最高的幾位大佬進行交流。但是ZZH正在忙著水群,於是把這個問題交給了你。事成之後,ZZH會給你2147483647%1的金幣作為獎勵

輸入

單組資料

第一行兩個整數n,m,分別代表今天ZZH水群的時間(以分計算)和今天想要與ZZH交流的大佬的數量(<=2000)。

之後m行,分別有兩個數字,代表和第i個大佬交流花費的時間(<n),以及大佬的Ω(<1000)。

輸出

今天與ZZH交流的大佬的Ω的值的總和。

範例輸入
70 371 10069 31 2
範例輸出
5

這道題一看就是很常見的背包問題,然後我不會做了,我用了自己以前的代碼,我檢討,我反思!

#include <iostream>#include <cstring>using namespace std;int main(){    int V,n;    cin>>V>>n;    int v[2100],p[2100],dp[2100];    memset(v,0,sizeof(v));    memset(p,0,sizeof(p));    memset(dp,0,sizeof(dp));    for(int i=1;i<=n;i++)        cin>>v[i]>>p[i];    for(int i=1;i<=n;i++)        for(int j=V;j>=v[i];j--)            dp[j]=max(dp[j-v[i]]+p[i],dp[j]);    cout<<dp[V];}

背包問題會就是會,不會也寫不出來,大概。沒什麼好說的,下一道吧。

A.智力大獎賽題目描述

輸入

只有一行,有一個整數N,表示大三角形的層數(N<=45000)

輸出

有兩行,
第一行只有一個數,表示小三角形的個數;
第二行也只有一個數,表示能量棒的個數。

範例輸入
8
範例輸出
64108

聽坐我對面的說A很好做,但是資料太大了。

emmmmm,好的,沒問題,BigInteger走起!

大概思路就是第1行1個三角,第2行2+1個,第3行3+2個……

然後能量棒是第1行3根,第2行6根,第3行9根……

很簡單的一道題,痛點就在資料太大,不過,我BigInteger怕過誰??

import java.math.BigDecimal;import java.util.Scanner;import java.math.BigInteger;public class Main {    public static void main(String[] args) {        // TODO Auto-generated method stub        Scanner in = new Scanner(System.in);        int n=in.nextInt();        BigInteger x1 = BigInteger.ZERO;        BigInteger x2 = BigInteger.ZERO;        BigInteger x3 = BigInteger.ZERO;        BigInteger y1 = BigInteger.ZERO;        BigInteger a1 = BigInteger.ONE;        BigInteger b1 = BigInteger.ONE;        BigInteger a2 = BigInteger.ZERO;        b1=b1.add(a1);        b1=b1.add(a1);        for(int i=0;i<n;i++) {            x1=x1.add(a1);            x2=x2.add(a2);            a1=a1.add(BigInteger.ONE);            a2=a2.add(BigInteger.ONE);            y1=y1.add(b1);            b1=b1.add(BigInteger.ONE);            b1=b1.add(BigInteger.ONE);            b1=b1.add(BigInteger.ONE);        }        x3=x1.add(x2);        System.out.println(x3);         System.out.println(y1);     }}

能隨意切換C++和JAVA的我真棒233333

下一道,H吧,感覺挺簡單的啊

H.數列題目描述

故事不編了,m哥牛逼!

給出一個長度為n的數列a,現在有如下三種操作:
1、 1 p x: 將a[p]更改為x
2、 2 l r: 求a[l]到a[r]的最大值與最小值的差
3、 3 l r: 求a[l]到a[r]的和
現在給你一些操作,請你求出相應的數值。

輸入

第一行輸入一個數字T表示資料群組數(1<=T<=10)
接下來T組資料,每組資料第一行為兩個整數n、m(1<=n,m<=1e5),分別代表a的長度和運算元,下一行n個整數表示a[1]到an,接下來m行,每行一個如題目給出的輸入格式的操作
(1<=p,l,r<=n,0<=x<=1000)

輸出

對於每組資料
對每一個操作2或3,輸出一個整數表示結果

範例輸入
24 41 2 3 42 1 21 2 72 1 23 1 45 42 7 6 3 82 1 31 3 12 1 53 3 3
範例輸出
1615571

這題真的很簡單啊,不就是一些數組的操作嗎?怎麼做的人那麼少。。。

唯一需要注意的就是題目中的數組是從1開始的。

#include <iostream>using namespace std;int suan(int a[],int l,int r){    int m1,m2;    m1=a[l];    m2=a[l];    for(int i=l+1;i<=r;i++){        m1=m1>a[i]?m1:a[i];        m2=m2<a[i]?m2:a[i];    }    return m1-m2;}int add(int a[],int l,int r){    int s=0;    for(int i=l;i<=r;i++){        s+=a[i];    }    return s;}int main(){    int t,n,m,x,p,y,l,r;    cin>>t;    while(t--){        cin>>n>>m;        int a[n+1];        for(int i=1;i<=n;i++){            cin>>a[i];        }        while(m--){            cin>>x;            switch(x){                case 1:cin>>p>>y;                        a[p]=y;                        break;                case 2:cin>>l>>r;                        cout<<suan(a,l,r)<<endl;                        break;                case 3:cin>>l>>r;                        cout<<add(a,l,r)<<endl;                        break;            }        }    }}

請不要在意我亂起的函數名!

然後這個時候我發現我排第12??!從來沒這麼高過,信心大增!!!

繼續加油!

看E好像做的人挺多的,我也來試試吧!

E.雲端運算題目描述

北化ACM社團有n台雲端服務器,每台伺服器都有一個使用到期日,第i台伺服器還能使用Ri天。現在有m個任務需要部署到雲端服務器上運行,第j個任務需要運行Tj天。第j個任務能夠部署在第i台伺服器上時若且唯若 Tj <=Ri,並且每台伺服器在其使用到期日內總共只能運行一個任務。即使Tk+Tj <=Ri,你也無法將第k個和第j個任務一起部署到第i 台伺服器上,否則這題將失去其簽到題的作用(看到簽到題這幾個字的時候我笑了)。為了能充分利用雲端服務器,現在需要計算最多能部署多少任務。而你作為北化ACM的希望,這個問題需要由你 來解決。

輸入

單組資料
第一行兩個整數代表 n和m
第二行 n個整數代表 R1,R2,...,Rn
第三行 m個整數代表T1,T2,...,Tm
1<= n,m,Tj ,Ri <=100000

輸出

輸出一個整數代表最多有多少個任務能夠部署到雲端服務器上

範例輸入
5 56 1 3 4 2 4 6 6 2 5 
範例輸出
3

既然是簽到題,哈哈,那就沒什麼好說的了,來吧,我不怕你!

#include <iostream>#include <algorithm>using namespace std;int main(){    int n,m,s=0;    cin>>n>>m;    int a[n],b[m];    for(int i=0;i<n;i++){        cin>>a[i];    }    for(int i=0;i<m;i++){        cin>>b[i];    }    sort(a,a+n);    sort(b,b+n);    int j=0;    for(int i=0;i<m;){        if(b[i]<=a[j]){            i++;            j++;            s++;        }        else{            j++;        }        if(j==n){            break;        }    }    cout<<s;}

嗯,很簡單,就隨便排排序,然後判斷一下使用到期日夠不夠就行了。

然後!!!第8了!!!

不過很可惜,我就止步4道了,之後再也沒做出來了,名次也掉到了50多名,不過也很強了啊!好久不做題了竟然還能突破之前的最後成績。

我沒做出來的B.求素數題目描述

輸入

共兩行:
第一行為N何L,中間用空格隔開。 (1<=N<=100 , 1<=L<=7)
第二行為N個0~9的數字,中間用空格隔開。

輸出

只有一行,含全部滿足條件的素數,中間用逗號隔開,保證至少存在一個素數。

範例輸入
10 38 9 1 0 2 3 5 4 7 6
範例輸出
547

自己感覺代碼沒問題了,但就是過不了。。就不放了。

D.積木題目描述

我懶得編故事了 m哥牛逼!
有n個積木,第i個積木的高度為a[i],求每個積木前面有幾個比它矮的積木

輸入

多組輸入,每組由兩行組成,第一行輸入n,第二行輸入n個數,為n個積木的高度a[i]
//(1<=n<=100000)(1<=a[i]<=1000000000)

輸出

每組資料輸出n個數,第i個數為第i個積木前面比他矮的積木的個數

範例輸入
51 2 3 4 5
範例輸出
0 1 2 3 4

這道題是喜聞樂見的逾時,最後也沒找到好的演算法。

看不懂,不想看的F.羅dalao的密碼題目描述

眾所周知,羅dalao十分的厲害。有一天,羅dalao發明了一種密碼,用來給文檔加密(可認為文檔是一個長度為n的字串s)。
羅dalao要對s[l]...s[r]加密,首先要反轉區間s[l]...sr,然後使k=(r-l+1)/2(向下取整),再反轉區間s[l]...s[l+k-1]和s[l+k]...s[r],以此類推,一直到區間長度都為1為止。(加密整個文檔相當於加密區間s[1]...s[n])
有一天你找到了一篇羅dalao加密過的文檔,現在要你求出某個位置的字元加密前的位置。

輸入

第一行輸入整數T(0<T<=1000),表示資料群組數,接下來T行,每行兩個整數n和p(1<=p<=n<=1e18),分別表示文檔長度和詢問的位置

輸出

輸出T行,每行一個整數,表示每組資料中加密後p位置的字元的原位置

範例輸入
44 14 24 34 4
範例輸出
3412
G.羅dalao的小電影題目描述

羅dalao非常的厲害,於是會有很多人向他請教一些問題,而他每天有L分鐘專門用來解答問題。由於來請教的人很多,所以要找羅dalao請教問題,需要預定。
於是,羅dalao知道每天會有n個人來請教問題,第i個到來的人在第ai分鐘到來,羅dalao解答問題要用ti分鐘(羅dalao精明的安排保證ai+ti<=ti+1和an+tn<=L),然而羅dalao想找閒置時間看小電影,羅dalao看每一部小電影都要從頭看到尾,期間不能有中斷,每部小電影的時間長度為m,羅dalao想知道他每天最多可以看多少部小電影,現在請你幫他計算一下。

輸入

單組
第一行3個整數:n,L和m(0<=n<=1e5,1<=L<=1e9,1<=m<=L)
接下來n行,每行兩個整數ai和ti(0<=ai<=L-1,1<=ti<=L)

輸出

輸出一個整數,表示羅dalao最多能觀看多少部小電影

範例輸入
2 11 30 11 1
範例輸出
3
I.Leo的簡單規律題題目描述

Leo喜歡吃燒烤,而且只吃三種,羊肉串,青菜,火腿腸,她吃燒烤之前喜歡把燒烤擺成一長串,而且還有特別的擺放規則,擺錯了她這一頓就不吃了。
規則有:1.對於連續的三個烤串,不能三個烤串都是同一種。
2.對於連續的三個烤串,如果三種烤串都有,青菜不能放在中間(在吃肉中途吃菜是會令人自閉的)
3.依舊是對於連續的三個烤串,第一串和第三串都是青菜的話,中間不能是羊肉或者火腿腸(她的意思是吃素減肥)
現在有三種烤串都有無數根,她想擺出長度為n的烤串,請你求出方案數(由於結果可能會很大,所以只需給出答案模1000000007)

輸入

第一行有一個數字T(T<100),表示有T組資料
接下來的T行,每行一個數字n (1≤N≤1010)

輸出

對於每一組資料,輸出擺出長度為n的烤串的方案數

範例輸入
42346
範例輸出
92046244
問題 J.Leo的簡單數列題目描述

Leo有兩個數列,它們的長度都是n
在最開始,a數列裡都是0,b數列是Leo隨機填充的n個數(數字為1-n,保證b數列是1-n的一個排列)
現在Leo可以進行兩種操作
\1. add L R 表示她給a數列從a[L],a[L+1],...,a[R],都加一

  1. query L R 表示她想知道當 L<= i <=R 時 a[i]/b[i](向下取整)的所有項的總和
    當然Leo在數學這一塊還不是很熟練,上次月考數學才110分,所以想請你幫她完成這些操作
輸入

多組資料
對於每組資料,第一行有2個數字n,q,表示a與b的長度 和運算元。1<= n,q < =100000
第二行有n個數字,表示數列b的初始狀態
接下來的q行,每行一個操作,具體操作格式如題目所給
1<= L <= R <= n

輸出

對於每一個query操作,輸出一行表示求和的結果。

範例輸入
6 106 1 4 3 2 5query 1 4add 2 2query 3 6add 1 6add 3 4query 2 5query 1 6add 2 4query 1 4query 3 5
範例輸出
002241
總結

我果然還是只能做簡單題。。

競賽網站

北京化工大學2018年10月程式設計競賽部分題解(A,C,E,H)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.