题目可能有或多或少的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的,然后看了一下写不出来,溜了溜了。