B题题目是CodeForces - 1009C Annoying Present
是一开始给我们一个长度为n的全0的数组,然后给我们m次变化,每次变化中给我们一个xi和di,每次的操作是,数组上每个数字都加上xi然后再加上di乘以dist| i - j |,
因为每个数字都要处理,所以我们可以直接处理整个数组,不管d是什么值,我们首先每次sum都是要加上xi*n的,接着关于d,如果他是正数的话,相当于每个数都加上
一个正数,那我们要保证它最大,我们就从第一位开始加就是d乘以0+1+2+.....+(n-1)所以就是d乘以n*(n-1)/ 2;如果他是负数,那我们就选择放在中间,这样数字就会尽可能小,
然后判断一下奇数还是偶数就好了,如果是奇数,我们假设是5 就是2+1+0+1+2,相当于(n+1)/2*(n-1)/2,如果是偶数,假设是6,就是2+1+0+1+2+3,相当于n*n/4;
这就是我们本题的解法了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxn 110000 using namespace std; #define ll long long int gi() { int x = 0; char c = getchar(); while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x; } #define mod 998244353 //123****123 int main() { ll n, m; cin >> n >> m; ll sum = 0; while (m--) { ll x, d; cin >> x >> d; if (d > 0) { sum += x * n + (n - 1) * n / 2 * d; } else { if (n % 2 == 1) { sum += x * n + (n + 1) / 2 * (n - 1) / 2*d; } else { sum += x * n + n * n / 4*d; } } } printf("%.13f ", (double)sum/n); }
C题题目是 CodeForces - 965C Greedy Arkady
题目意思是给我们n个糖果,k个人,让我们选择一个x,每次分配x个糖果给每个人,要使第一个拿糖果的人,能够拿到最多的糖果(对于他而言),x有上限M,同时
分配的次数也有限制不能多于D次。
思路:我的想法是每次分配x个糖果,那么相当于我们可以分配m圈,我们只要保证第一个人拿到的数量是m+1圈就可以找一个最大值,保证他的数量最大了,那我们就每次
遍历圈数,看看能不能满足条件,然后取最大值,然后本题有一个坑点,如果你是每次遍历的话,会wa18组,因为他给我们的测试样例为
1000000000000000000 1000000000000000000 1000 1000
然后我们就会出现后面n/(k*(m)+1)的结果为正,所以就会出现错误,这里我们加一个判断,如果结果为0了,后面就不用判断了就结束了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxn 110000 using namespace std; #define ll long long int gi() { int x = 0; char c = getchar(); while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x; } #define mod 998244353 //123****123 int main() { ll n, k, m, d; cin >> n >> k >> m >> d; ll maxx = 0; //cout << n / (k * 19 + 1) << endl; for (ll i = 1; i <= d; i++) { ll x = (n) / ( (i - 1)*k + 1); if (x == 0)break; //cout << x << endl; if (x > m) { x = m; } //cout << maxx << endl; maxx = max(maxx, x * i); } cout << maxx << endl; }