第一次模拟赛题解 T140825 【集结军队】

· · 个人记录

恭喜各位顺利度过本次比赛!下面让我们一起来看看本次比赛T1的题解吧!

一、90分做法

本题一共有两问,先来考虑第一问

由题意得,己方军队的总战力=所有师的战力和。

所以我们可以先设置一个数组来储存每个师的战力,然后运用for循环读入每个师的战力,如:

int n,z[100005];//多开5个以防越界
cin>>n;
for (int i=1;i<=n;i++){
    cin>>z[i];
}

再计算所有师的总战力时,我们只需要再设置一个for循环计算即可,如:

int ans=0;
for (int i=1;i<=n;i++){
    ans+=z[i];
}
cout<<ans<<" ";

当然,我们可以考虑到在所有程序中,z 数组一共只被使用了一次,故我们可以不设置它,而是用一个变量储存后直接读入答案,这样就可以缩短很多码量以及节省空间,如:

int ans=0,z,n;
cin>>n;
for (int i=1;i<=n;i++){
    cin>>z;
    ans+=z;
}
cout<<ans<<" ";

这样我们就完成读入+计算总战力了。

第二问要求我们知道需要增援多少战力。我们可以分类讨论:

  1. 如果己方总战力大于等于敌方总战力,则不需要增派战力,输出 0

  2. 如果己方总战力小于地方总战力,则需要增派 m-我方总战力 的兵力。

代码如下:

if (ans>=m) cout<<0<<endl;
else cout<<m-ans<<endl;

完了吧?好像应该满分了。但是如果只是这样,你会收到一个 surprise

怎么错了呢?我们不妨来考虑一下数据范围:

∵ n\le 10^5$,$z_i\le 10^6 ∴$ 最高值可达 $ans\le 10^{11}

int 的数据范围最高约为 2\times 10^{10}

轰!int 爆了!

二、100分做法

把前面的 ans 的数据类型改成long long就行了!(手动滑稽

代码就不给了,前面的应该够了。