Comet OJ - Contest #8 AB

題目可能有或多或少的CV錯誤,原題鏈接:這裏這裏  

                                                殺手皇后

時間限制:1000ms 內存限制:256MB

 

題目描述

這道題用來紀念原本的E題。

突然有人告訴小D,由於某種神祕力量的侵襲,他原本的題目不能用了。別無他法,小D只能從手中的題目裏再選一道出來,但由於小D非常難過,這項任務就交給你。具體來說,每道題目有一個由小寫字母組成的字符串作爲名字,你需要選出一個名字的字符串字典序最小的題目作爲新的題目,並輸出這個字符串。

關於如何比較兩個字符串的字典序,方法是這樣的:從左邊第一位開始,如果兩個串這一位上的字符不一樣,則結束比較,這一位上字符小的串字典序更小,否則繼續比較下一位。特殊的,如果比較至某一位時某個串比另一個串長度短提前結束,則長度短的串字典序更小。

 

輸入描述

第一行輸入一個正整數 nn,

接下來 n 行,每行讀入一個小寫英文字母構成的字符串。

  • 2 <= n <= 1000    2≤n≤1000
  • 每個最長的字符串的長度都介於 11 和 10001000 之間(包含 11 和 10001000)

 

輸出描述

輸出一行,即輸入字符串中字典序最小的字符串。

樣例輸入 1 

5
abbab
abaa
bbab
aba
c

樣例輸出 1

aba

這道題雖然沒什麼說的(大佬50s的1A),但是用vector套string感覺很好玩(以前沒玩過)。                  

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const int MAXN = 1e5 + 7;

int main()
{
    ios::sync_with_stdio(false);
    vector <string> ve;
    string s;
    int n;
    cin>>n;
    while(n--)
    {
        cin>>s;
        ve.push_back(s);
    }
    sort(ve.begin(), ve.end());
    cout<<ve[0]<<endl;

    return 0;
}

   

                                               支援城市

時間限制:1000ms內存限制:256MB

 

題目描述

1267年,戰爭的味道在空氣中瀰漫,強大的尼弗迦德帝國蓄勢待發。覬覦着雅魯加河對岸的北方領域。萊里亞的女王米薇爲了抵禦尼弗迦德帝國的進攻,在萊里亞王國內建造了 nnn 個城市。第 iii 個城市中居住着 wiw_iwi​ 個公民。當尼弗迦德帝國進攻某一個城市時,其他所有城市將支援被進攻的城市。但這些城市的居民會因爲支援其他城市而產生不滿意度。

當城市 aaa 要前往城市 bbb 支援時,會產生 (wa−wb)2(w_a-w_b)^2(wa​−wb​)2 點不滿意度。

米薇女王想知道對於每個城市被進攻時,分別會產生多少點不滿意度。

即對於每個城市 xxx ,你需要回答 ∑i=1,n​(wi​−wx​)^2的值。

 

輸入描述

第 1 行一個整數 n ,代表有 n 座城市。

第 2 行 n 個整數,第 i 個整數 wi代表第 i 個城市的人口數量。

  • 2≤n≤10^5
  • 1≤wi≤10^6

 

輸出描述

一行 nnn 個整數,分別是第 111 個被攻擊產生的不滿意度到第 nnn 個城市被攻擊的不滿意度。

樣例輸入 1

3
3 3 3

樣例輸出 1

0 0 0 

樣例輸入 2

3
3 4 5

樣例輸出 2

5 2 5 

樣例輸入 3

5
19 4326 7891 744 999

樣例輸出 3

82004658 55159127 173256882 64500983 59594018 

 

這道題首先排除暴力寫法,不要老想着暴力出奇跡好不好。然後想想其他方法,怎麼把O(n^2)的複雜度降低到O(n)。

可以把∑i=1,n​(wi​−wx​)^2公式拆分一下,只用一個循環就行了。

 公式:s2(平方和) + arr[i]*arr[i]*n - arr[i]*s1(和)*2

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const int MAXN = 1e5 + 7;

ll arr[MAXN];

int main()
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    ll s1, s2;
    s1 = s2 = 0;
    for(int i = 0; i < n; i++)
    {
        cin>>arr[i];
        s1 += arr[i];
        s2 += arr[i]*arr[i];
    }
    for(int i = 0; i < n; i++)
    {
        cout<<s2 + arr[i]*arr[i]*n - arr[i]*s1*2<<' ';
    }

    return 0;
}

本來想寫C的,然後看了一下寫不出來,溜了溜了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章