A.[COCI2016-2017#1] Tarifa
思路
- 1.算出n+1个月共有多少流量,再减去前n个月用掉的,就是答案。
坑点
- 1.无
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x, n;
cin >> x >> n;
x *= (n+1);
for (int i = 1; i <= n; i ++ )
{
int xx; cin >> xx;
x -= xx;
}
cout << x << endl;
return 0;
}
总结
签到
B.総和
思路
- 1.暴力枚举即可,注意判断边界。
- 2.也可以用前缀和的思想来做。
坑点
- 1.开long long
代码
暴力
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int n, m, sum = 0;
cin >> n >> m;
int a[n + 10] = {
0};
for (int i = 1; i <= n; i ++ )
{
cin >> a[i];
}
for (int i = 1; i <= n - m + 1; i ++ )
{
for (int j = i; j <= i + m - 1; j ++ )
{
sum += a[j];
}
}
cout << sum << endl;
return 0;
}
前缀和
#include<bits/stdc++.h>//众所周知的万能头文件
using namespace std;
long long a[100010],num[100010]={
0};
//不要忘了初始化为0
long long n,k,sum=0;
//以上为定义(要long long否则会爆int)
//a[]表示输入的数列,num[i]表示a[i]的前缀和;
//n,k如题,sum为最后的答案
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)//读入数列
{
cin>>a[i];
num[i]=num[i-1]+a[i];//计算a[i]的前缀和
}//预处理完毕!
for(int i=k;i<=n;i++)//这里i从k开始循环,a[i]代表区间的末尾,num[i]代表区间末尾的前缀和
{
sum+=num[i]-num[i-k];
}
cout<<sum<<endl;//可爱地输出答案
return 0;
}
总结
签到题
C.Omkar and Waterslide
思路
- 1.见题解
坑点
- 1.无
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int t; cin >> t;
while (t -- )
{
int n; cin >> n;
int a[n + 10] = {
0};
for (int i = 1; i <= n; i ++ )
{
cin >> a[i];
}
int ans = 0;
for (int i = 2; i <= n; i ++ )
{
if (a[i] < a[i - 1])
{
ans += (a[i - 1] - a[i]);
}
}
cout << ans << endl;
}
return 0;
}
总结
思维题
D. 缘分计算
思路
- 1.见题解
坑点
- 1.要注意前导0的问题
代码
见题解
总结
大模拟
E.奖学金
思路
- 1.结构体排序
- 2.关于如何使用结构体排序,点击查看详情
坑点
- 1.无
代码
#include<bits/stdc++.h>
using namespace std;
struct name{
int flag;
int a;
int b;
int c;
int sum;
}num[350];
bool cmp(name a, name b)
{
if (a.sum != b.sum)
{
return a.sum > b.sum;
}
if (a.sum == b.sum && a.a != b.a)
{
return a.a > b.a;
}
if(a.sum == b.sum && a.a == b.a)
{
return a.flag < b.flag;
}
}
int main()
{
int n; cin >> n;
for (int i = 1; i <= n; i ++ )
{
cin >> num[i].a >> num[i].b >> num[i].c;
num[i].flag = i;
num[i].sum = num[i].a + num[i].b + num[i].c;
}
sort(num + 1, num + 1 + n, cmp);
for (int i = 1; i <= 5; i ++ )
{
cout << num[i].flag << " " << num[i].sum << endl;
}
return 0;
}
总结
排序模板题