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的,然后看了一下写不出来,溜了溜了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值