1. 程式人生 > >浪在ACM11.2第三次訓練賽

浪在ACM11.2第三次訓練賽

A.珠心算測試

題目描述

珠心算是一種通過在腦中模擬算盤變化來完成快速運算的一種計算技術。珠心算訓練, 既能夠開發智力,又能夠為日常生活帶來很多便利,因而在很多學校得到普及。 某學校的珠心算老師採用一種快速考察珠心算加法能力的測驗方法。他隨機生成一個正 整數集合,集合中的數各不相同,然後要求學生回答:其中有多少個數,恰好等於集合中另 外兩個(不同的)數之和? 最近老師出了一些測驗題,請你幫忙求出答案。

輸入

輸入共兩行,第一行包含一個整數 n,表示測試題中給出的正整數個數。  第二行有 n 個正整數,每兩個正整數之間用一個空格隔開,表示測試題中給出的正整數。 

輸出

輸出共一行,包含一個整數,表示測驗題答案。

樣例輸入

4
1 2 3 4

樣例輸出

2

提示

【樣例說明】      由 1+2=3,1+3=4,故滿足測試要求的答案為 2。注意,加數和被加數必須是集合中的 兩個不同的數。  【資料說明】       對於 100%的資料,3 ≤ n ≤ 100,測驗題給出的正整數大小不超過 10,000。 

B.比例簡化

題目描述

在社交媒體上,經常會看到針對某一個觀點同意與否的民意調查以及結果。例如,對某 一觀點表示支援的有 1498 人,反對的有 902 人,那麼贊同與反對的比例可以簡單的記為 1498:902。 不過,如果把調查結果就以這種方式呈現出來,大多數人肯定不會滿意。因為這個比例 的數值太大,難以一眼看出它們的關係。對於上面這個例子,如果把比例記為 5:3,雖然與 真實結果有一定的誤差,但依然能夠較為準確地反映調查結果,同時也顯得比較直觀。 現給出支援人數 A,反對人數 B,以及一個上限 L,請你將 A 比 B 化簡為 A’比 B’,要 求在 A’和 B’均不大於 L 且 A’和 B’互質(兩個整數的最大公約數是 1)的前ᨀ下,A’/B’ ≥ A/B 且 A’/B’ - A/B 的值儘可能小。

輸入

輸入共一行,包含三個整數 A,B,L,每兩個整數之間用一個空格隔開,分別表示支援 人數、反對人數以及上限。

輸出

輸出共一行,包含兩個整數 A’,B’,中間用一個空格隔開,表示化簡後的比例。

樣例輸入

1498 902 10 

樣例輸出

5 3

提示

【資料說明】       對於 100%的資料,1 ≤ A ≤ 1,000,000,1 ≤ B ≤ 1,000,000,1 ≤ L ≤ 100, A/B ≤ L。 

C.螺旋矩陣

題目描述

一個 n 行 n 列的螺旋矩陣可由如下方法生成: 從矩陣的左上角(第 1 行第 1 列)出發,初始時向右移動;如果前方是未曾經過的格子, 則繼續前進,否則右轉;重複上述操作直至經過矩陣中所有格子。  根據經過順序,在格子中 依次填入 1, 2, 3, ... , n 2 ,便構成了一個螺旋矩陣。  下圖是一個 n = 4 時的螺旋矩陣。 

  現給出矩陣大小 n 以及 i 和 j,請你求出該矩陣中第 i 行第 j 列的數是多少。 

輸入

輸入共一行,包含三個整數 n,i,j,每兩個整數之間用一個空格隔開,分別表示矩陣 大小、待求的數所在的行號和列號。

輸出

輸出共一行,包含一個整數,表示相應矩陣中第 i 行第 j 列的數。

樣例輸入

4 2 3 

樣例輸出

14

提示

【資料說明】      對於 50%的資料,1 ≤ n ≤ 100; 對於 100%的資料,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。 

D.子矩陣

題目描述

一個 n 行 n 列的螺旋矩陣可由如下方法生成: 從矩陣的左上角(第 1 行第 1 列)出發,初始時向右移動;如果前方是未曾經過的格子, 則繼續前進,否則右轉;重複上述操作直至經過矩陣中所有格子。  根據經過順序,在格子中 依次填入 1, 2, 3, ... , n 2 ,便構成了一個螺旋矩陣。  下圖是一個 n = 4 時的螺旋矩陣。   現給出矩陣大小 n 以及 i 和 j,請你求出該矩陣中第 i 行第 j 列的數是多少。 

輸入

輸入共一行,包含三個整數 n,i,j,每兩個整數之間用一個空格隔開,分別表示矩陣 大小、待求的數所在的行號和列號。

輸出

輸出共一行,包含一個整數,表示相應矩陣中第 i 行第 j 列的數。

樣例輸入

4 2 3 

樣例輸出

14

提示

【資料說明】      對於 50%的資料,1 ≤ n ≤ 100; 對於 100%的資料,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。 

E.計數問題

題目描述

試計算在區間 1 到 n 的所有整數中,數字 x(0 ≤ x ≤ 9)共出現了多少次?例如,在 1 到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,數字 1 出現了 4 次。

輸入

輸入共 1 行,包含 2 個整數 n、x,之間用一個空格隔開。

輸出

輸出共 1 行,包含一個整數,表示 x 出現的次數。

樣例輸入

11 1

樣例輸出

4

提示

【資料說明】       對於 100%的資料,1≤ n ≤ 1,000,000,0 ≤ x ≤ 9。 

F.表示式求值

題目描述

給定一個只包含加法和乘法的算術表示式,請你程式設計計算表示式的值。

輸入

輸入僅有一行,為需要你計算的表示式,表示式中只包含數字、加法運算子“+”和乘 法運算子“*”,且沒有括號,所有參與運算的數字均為 0 到 2^31 -1 之間的整數。  輸入資料保 證這一行只有 0~ 9、+、*這 12 種字元。 

輸出

輸出只有一行,包含一個整數,表示這個表示式的值。  注意:當答案長度多於 4 位時, 請只輸出最後 4 位,前導 0 不輸出。 

樣例輸入

1+1*3+4 

樣例輸出

8

提示

樣例 計算的結果為 8,直接輸出 8。  【資料範圍】      對於 30%的資料,0≤表示式中加法運算子和乘法運算子的總數≤100;       對於 80%的資料,0≤表示式中加法運算子和乘法運算子的總數≤1000;      對於 100%的資料,0≤表示式中加法運算子和乘法運算子的總數≤100000。 

突然發現自己和振原同學,劉凱同學(是弟弟)的思路有很多重合之處,可能這就是菜菜與巨巨們之間莫名的心靈感應?(劃掉),總體思路就是先算乘法後算加法,為什麼?首先,乘法比加法的優先順序高(廢話( ̄▽ ̄)"),其次,乘法的連乘要特別注意。

連乘怎麼寫呢,比如a*b*c  可以把乘號後邊的乘數b變成兩乘數的乘積ab,然後a變成0,(利於加法去加,加0不會改變),然後ab與c相乘,同理變成 0,abc。然後數組裡就變成0,0,abc,相加就闊以了(鼓掌(ง •_•)ง)

我使用的陣列存數字,用字元存符號,首先第一個 是數字,然後就一直字元數字 字元數字...到字元為'\n'為止,所以可以先存一下第一個數字,然後再按字元數字的規律存。還有,加法和乘法都符合同餘定理,記得隨時mod(被坑了好久沒爬出來,嚶嚶嚶? o(≧口≦)o) 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define Mod 1000
const int maxn=1000000+5;
char ch;
ll a[maxn];
int later;
int main()
{
    int num=0;
    int flag=0;
    cin>>a[num];  //第一個數字
    a[num]=a[num]%Mod;
    num++;
    while(1)
    {
        ch=getchar();//字元數字規律開始
        if(ch=='\n')
            break;
        cin>>a[num];
        a[num]%=Mod;
        //cout<<a[num-1]<<' '<<a[num]<<endl;
        if(ch=='*')//如果乘號的話,乘號
        {
            a[num]=a[num]*a[num-1]%Mod;//後面的乘數變成乘積
            //cout<<"num:"<<a[num]<<' ';
            a[num-1]=0;//前面的乘數化0
        }
        num++;
    }
    ll sum=0;
    for(int i=0;i<num;i++)
    {
        //cout<<a[i]<<endl;
        sum=(sum+a[i])%Mod;//求和
    }
    sum=sum%Mod;
    cout<<sum<<endl;
}