A:
题意:
算一个高斯求和,加加减减,若减成负数,输出0.。。。。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 1e3 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int k, n, w;
scanf("%d%d%d", &k, &n, &w);
int ans = w * (1 + w) / 2 * k - n;
if (ans >= 0)
printf("%d\n", ans);
else
printf("0\n");
return 0;
}
B:
题意:
给n个数,现在只能往上加让每个数都不相同,问最少往上加多少的和。
解析:
贪心,排个序,然后若相同,不断往上加。
开始应该是数组开小了。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 3e3 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);
int a[maxn];
bool vis[maxn * 4];
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
sort(a, a + n);
memset(vis, false, sizeof(vis));
int ans = 0;
for (int i = 0; i < n; i++)
{
int t = a[i];
if (!vis[t])
{
vis[t] = true;
}
else
{
while (vis[t])
{
ans++;
t++;
}
vis[t] = true;
}
}
printf("%d\n", ans);
return 0;
}
C:
题意:
两个人玩牌,每张牌的权值是不同的。
开始的时候第一个人有k1张,第二个人有k2张牌。
现在他们各自从自己那堆牌的顶部拿出一张,比较大小,大者胜,并按小到大的顺序将牌插入到末尾。
问经过几轮比赛谁获胜,若无限循环没有结果,输出-1.
解析:
直接用队列模拟。
若循环超过 2^10 则判定无限循环。
2^10 : 每个数字能选择的去处是第一堆和第二堆,则10个数可以选择的位置为2 ^ 10。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 3e3 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int n;
cin >> n;
int ans = 0;
int k1, k2;
cin >> k1;
queue<int> q1;
queue<int> q2;
for (int i = 0; i < k1; i++)
{
int x;
scanf("%d", &x);
q1.push(x);
}
cin >> k2;
for (int i = 0; i < k2; i++)
{
int x;
scanf("%d", &x);
q2.push(x);
}
int flag = -1;
while (1)
{
int t1 = q1.front();
q1.pop();
int t2 = q2.front();
q2.pop();
if (t1 < t2)
{
q2.push(t1);
q2.push(t2);
}
else
{
q1.push(t2);
q1.push(t1);
}
ans++;
if (q1.empty())
{
flag = 2;
break;
}
if (q2.empty())
{
flag = 1;
break;
}
if (ans > 1025)
{
break;
}
}
if (flag == 1)
{
printf("%d 1\n", ans);
}
else if (flag == 2)
{
printf("%d 2\n", ans);
}
else
{
printf("-1\n");
}
return 0;
}
D:
题意:
给n, k, 求 n! / k! 的素因子个数。
解析:
神级思想啊。当时我只想到了数论里面的求C(n,k)的素因子个数,搞了半天没搞出来。。。
具体神在直接用dp算出了因子的个数。
ans[ j ] 表示的是当前这个数 j 有多少个素因子。
然后前缀和一下,求的时候减就好了。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 5000000;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);
int ans[maxn + 10];
void initTable()
{
memset(ans, 0, sizeof(ans));
for (int i = 2; i <= maxn; i++)
{
if (ans[i] == 0)
{
for (int j = i; j <= maxn; j += i)
{
ans[j] = ans[j / i] + 1;
}
}
}
for (int i = 2; i <= maxn; i++)
{
ans[i] += ans[i - 1];
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
initTable();
int ncase;
scanf("%d", &ncase);
while (ncase--)
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", ans[a] - ans[b]);
}
return 0;
}