題目可能有或多或少的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的,然後看了一下寫不出來,溜了溜了。