回顾一下上次个人赛。
A - Petya and Java
CodeForces - 66A题意:输入一个整数,判断该数的数据类型是否为byte, short, int, long, BigInteger。
显然输入的数要用字符串处理,由于字符串比较大小是按字典序比较,所以可以直接比较。
#include <bits/stdc++.h>
#define show(a) cout << #a << " = " << a << endl;
const int MOD = 1e9+7;
const int MAXN = 105;
using namespace std;
int main()
{
string num;
cin >> num;
int len = num.size();
if (len < 3 || len == 3 && num <= "127")
cout << "byte\n";
else if (len < 5 || len == 5 && num <= "32767")
cout << "short\n";
else if (len < 10 || len == 10 && num <= "2147483647")
cout << "int\n";
else if (len < 19 || len == 19 && num <= "9223372036854775807")
cout << "long\n";
else
cout << "BigInteger\n";
return 0;
}
C - QAQ
CodeForces - 894A题意:给你一个字符串,求里面有多少QAQ
三重循环暴力搜索。
#include <bits/stdc++.h>
#define show(a) cout << #a << " = " << a << endl;
const int MOD = 1e9+7;
const int MAXN = 105;
using namespace std;
int main()
{
string n;
cin >> n;
int f = 0, ans = 0, len = n.size();
while (f <= len - 3)
{
//show(f);
while (n[f] != 'Q' && f <= len - 3)
f++;
for (int i = f + 1; i <= len - 2; i++)
{
if (n[i] != 'A')
continue;
for (int j = i + 1; j <= len - 1; j++)
{
if (n[j] == 'Q')
ans++;
}
}
f++;
}
cout << ans << endl;
return 0;
}
CodeForces - 732C
题意:给出一个人吃的早、中、晚饭的顿数,求他至少漏吃了几顿饭。
找规律可知答案为最大数分别减其余两个数再-1,如果是负数的话取0。
#include <bits/stdc++.h>
#define show(a) cout << #a << " = " << a << endl;
const int MOD = 1e9+7;
const int MAXN = 10005;
typedef long long ll;
using namespace std;
int main()
{
ll a,b,c;
cin >> a >> b >> c;
if (a < b && b >c)
swap(a,b);
else if (a < c)
swap(a,c);
if (b < c)
swap(b,c);
ll ans;
ans = max(a-b-1,(ll)0) + max(a-c-1,(ll)0);
cout << ans << endl;
return 0;
}
E - Little Girl and Maximum Sum
CodeForces - 276C题意:
给出N个数,我们可以将其任意排列。一共有Q个查询,每个查询表示求一个区间的和,问我们如何排列序列使得所有的查询的总和最大。输出最大总和。
一开始我用一个数组记录某个数出现的次数,然后用一个循环来统计,时间复杂度最大为O(qn),然后不幸地tle了。
这题要用到高级一点的数学方法,一个统计数组,区间起点+1,终点之后-1,这样时间复杂度降到了O(q)。
#include <bits/stdc++.h>
#define show(a) cout << #a << " = " << a << endl;
const int MOD = 1e9+7;
const int MAXN = 200005;
using namespace std;
long long num[MAXN],cont[MAXN] {};
int vis[MAXN] {};
int main()
{
int n,q,f,l;
long long ans = 0;
cin >> n >> q;
for (int i = 1; i <= n; i++)
{
scanf("%d",&num[i]);
}
sort(num+1,num+n+1);
for (int i = 1; i <= q; i++)
{
scanf("%d %d",&f,&l);
vis[f]++;
vis[l+1]--;
}
int now = 0;
for (int i = 1; i <= n; i++)
{
now += vis[i];
cont[i] = now;
}
sort(cont+1,cont+n+1);
for (int i = 1; i <= n; i++)
{
ans += cont[i] * num[i];
}
cout << ans << endl;
return 0;
}