建電上學期大社賽詳解

By: Yeedrag & Lemon

前10圖表:

答對率一覽:

原本預期難度:

Lemon: 

高一應該會有兩個4分以上

平均應該約兩題

Yeedrag:

至少一個高一破台,pD AC率<20%

預期難度分布: pA->pC->pB->pE->pD

pA.建中電研大赦賽!

解答:

    直接輸出就好。

#include<iostream>
using namespace std;
int main(){
    cout<<"Hello, CKEISC!"<<endl;
}

這題沒有輸入 > <

pC.大米與他的毒瘤加密

題目:

依據字串長度的奇偶性,

決定使用哪個加密用字串。

 

並利用字母的順序(a~z)對照加密用字串,

輸出加密後的字串。

替換式密碼的簡化版(?

我們要做ㄉ

先判斷字串長度是奇數or偶數

然後利用ASCII的特性:

我們讓一個小寫字母減去'a',

就會剛好是字母的順序!

e.g.

'a' - 'a' = 0

'b' - 'a' = 1

'z' - 'a' = 25

CODE

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s1, s2, p;
    cin >> s1 >> s2 >> p;
    for(int i = 0; i < p.size(); ++i) {
        if(p.size()%2 == 1) cout << s1[p[i] - 'a'];
        else cout << s2[p[i] - 'a'];
    }
    cout << '\n';
}

熟悉對字串ㄉ操作

pB.咖哩拌飯

題目: 

每個咖哩飯的喜愛值都由三個變數\(a,b,c\)決定,請找出喜愛度最高的咖哩飯並且輸出他是第幾個。

做法:

直接實作,用迴圈跑過所有咖哩飯,再用兩個變數紀錄目前最大的和最大的編號是多少。

喜愛值有可能加起來超小!

扣的:

#include<iostream>
using namespace std;
int main(){
    int a,b,c;
    cin>>a>>b>>c;
    int t;
    cin>>t;
    int biggest = -2147483647;//一個很小的值
    int index = -1;//紀錄目前最小的索引值
    for(int i=1;i<=t;i++){
        int d,e,f;
        cin>>d>>e>>f;
        int sum = (d*a)+(e*b)+(f*c);//這碗飯的喜愛值
        if(sum>biggest){
            index = i;
            biggest = sum;
        }
    }
    cout<<index<<endl;
}

pE.發電機問題

題目:

可能畫張圖(?

以範例一為例:

上面是電場值,下面是座標w

你會發現我不會畫圖

反正其實就是解我給的那條柿子:

              \(\sum^{n}_{i=1} k - d_{i}p\)

          \(=\sum^{n}_{i=1} k - p|s - x_{i}|\)

就是把每個發電機的值相加,

然後我們希望它最大而已。

如果你看不懂\(\sum^{n}_{i=1}\)反正就是把\(n\)個點的東東都加起來(?

做法

 \(\sum^{n}_{i=1} k - p|s - x_{i}|\)

你們作為數學大師,

會發現\(k, p\)是常數

且因為\(p > 0\)所以我們會希望

 \(\sum^{n}_{i=1} |s - x_{i}|\)盡量小

\(s\)只要找中間(\(x_{\frac{n}{2}}\))就好ㄌ

然後就把值算出來(?

CODE

#include <iostream>
using namespace std;
int main() {
    int n, k, p;
    cin >> n >> k >> p;
    long long int x[n];
    for(int i = 0; i < n; ++i) {
        cin >> x[i];
    }
    long long int cnt = 0; //記得long long
    long long int s = x[n/2];
    for(int i = 0; i < n; ++i) {
        cnt += k - p*abs(x[i] - s);
    }
    cout << cnt << '\n';
    return 0;
}

pD.富豪雷夢與神偷大米

題目:

請你找到一組數對\((x,y)\),使\(H(x,y) = r\),

而當中x,x-又是所有可能中最小的那個,並且\(x,y\)皆為正整數,

且\(x\)為所有可能性中最小的那個。

 

觀察一下式子:

\(r = x^2+2xy+x+1\)

把\(1\)移過去得:

\((r-1) = x^2+2xy+x\)

會發現:

  1. \(2xy\)恆為偶數

  2. \(x^2+x\)恆為偶數

\(r-1\) 不可能是奇數!

也就是 \(r\)不可能為偶數!

條件1:

繼續研究式子:

\((r-1) = x^2+2xy+x\)

右式提\(x\)出來:

\((r-1) = x(x+2y+1)\)

到這邊不難看出一個策略:

\(x\)要是一個最小的正整數,

那我們可以取\(x=1\)來做!

繼續研究式子:

代入\(x=1\):

\((r-1) = 2y+2\)

\(y=\frac{(r-3)}{2}\)

故我們得出一個策略:

\(r\)為奇數時,有答案

\(x=1,y=\frac{(r-3)}{2}\)

然後就吃WA了。

回頭看一下條件:

​\(x,y\)皆為正整數

如果 \(r=1\):

\(x = 1, y = -1\)

如果\(r=3\):

\(x=1,y=0\)

 

#include<iostream>
using namespace std;
int main(){
    long long int r;
    cin>>r;
    if(r%2==0||r==1||r==3){
        cout<<"NO"<<endl;
    } else {
        cout<<1<<" "<<(r-3)/2<<endl;
    }
}

Code:

頒獎la

高二前三名

  1. wayne1215(5AC)
  2. liquid(3AC)
  3. henry652213(3AC)

高一前三名

  1. nameless35722 (4AC)
  2. aww (3AC)
  3. verstand (3AC)

堅忍不拔獎

justingod

pB錯了6次後AC,so dian...

壓線狂魔獎

nameless35722

結束前11秒AC www

最佳毒瘤獎

rain0130

#include<iostream>
using namespace std;
int main()
{
  int a,b,c,x;
  cin>>a>>b>>c>>x;
  int y[x*3],q=0;
  for(int n=0;n<x*3;n++)
  {
    cin>>y[n];
  }
  int p=y[0]*a+y[1]*b+y[2]*c;
  for(int n=3;n<x*3;n+=3)
  {
    int z=y[n]*a+y[n+1]*b+y[n+2]*c;
    if(z>p)
    {
      p=z;
      q=n;
    }
  }
  cout<<q/3+1<<'\n';
}

把全部東西存在一起是甚麼操作w

然後還AC

沒得獎也沒關係

下禮拜有小社的社賽ㄛ

學弟報寒訓la

寒訓特別好玩 ㄎㄎ

這學期最後一堂大社QAQ

下學期也要來電研找我們ㄛ

Made with Slides.com