#include<bits/stdc++.h>
using namespace std;voidfre(){freopen("A.txt","r",stdin);freopen("Ans.txt","w",stdout);}voidFre(){freopen("A.txt","r",stdin);}#define ios ios::sync_with_stdio(false)#define Pi acos(-1)#define pb push_back#define fi first#define se second#define ll long long#define ull unsigned long long #define db double#define Pir pair<int, int>#define PIR pair<Pir, Pir>#define INF 0x3f3f3f3f#define mod 998244353constint mxn =2e5+10;int ar[mxn];intmain(){/* fre(); */int T;scanf("%d",&T);while(T --){int n, m, k;scanf("%d %d %d",&n,&m,&k);int ct = n / k;int mx =min(ct, m);int sr = m - mx;
k --;int ans = mx -ceil((db)sr / k);printf("%d\n", ans);}return0;}
#include<bits/stdc++.h>
using namespace std;voidfre(){freopen("A.txt","r",stdin);freopen("Ans.txt","w",stdout);}voidFre(){freopen("A.txt","r",stdin);}#define ios ios::sync_with_stdio(false)#define Pi acos(-1)#define pb push_back#define fi first#define se second#define ll long long#define ull unsigned long long #define db double#define Pir pair<int, int>#define PIR pair<Pir, Pir>#define INF 0x3f3f3f3f#define mod 998244353constint mxn =1e3+10;char ar[mxn][mxn];intmain(){/* fre(); */int T;scanf("%d",&T);while(T --){int n, m, a, b;scanf("%d %d %d %d",&n,&m,&a,&b);
b =min(2* a, b);for(int i =1; i <= n; i ++){scanf("%s", ar[i]+1);
ar[i][0]='*';
ar[i][m +1]='*';}int sum =0;for(int i =1; i <= n; i ++){int lst = m;int pre = m;for(; pre >=0; pre --){if(ar[i][pre]=='*'){
sum +=(lst - pre)/2* b +(lst - pre)%2* a;
lst = pre -1;}}}printf("%d\n", sum);}return0;}
C. Mixing Water(二分/三分/数学 )
分析
题意
给我们一个空桶,我们可以向其中 倒入 x杯热水,之后可以选择向其中倒入 (x-1)或者 x 杯凉水 , 热水的温度为 h,冷水的温度为c,
#include<bits/stdc++.h>
using namespace std;voidfre(){freopen("A.txt","r",stdin);freopen("Ans.txt","w",stdout);}voidFre(){freopen("A.txt","r",stdin);}#define ios ios::sync_with_stdio(false)#define Pi acos(-1)#define pb push_back#define fi first#define se second#define ll long long#define ull unsigned long long #define db double#define Pir pair<int, int>#define PIR pair<Pir, Pir>#define INF 0x3f3f3f3f#define mod 998244353
ll h, c, t;
db check(db a, db b){returnabs((a * h + b * c)/(a + b)- t);}intmain(){/* fre(); */int T;scanf("%d",&T);while(T --){scanf("%lld %lld %lld",&h,&c,&t);if(h + c >=2* t){printf("2\n");}else{
ll l =0, r = INF, lm, rm;while(l < r){
lm = l +(r - l)/3;
rm = r -(r - l)/3;if(check(lm +1, lm)<=check(rm +1, rm))
r = rm -1;else
l = lm +1;}printf("%lld\n",2* l +1LL);}}return0;}
其次是我们在遍历寻找符合题意的区间段的时候,我们要在每一个位置都要维护区间最大和 即:
a
n
s
=
m
a
x
(
a
n
s
,
s
u
m
)
ans=max(ans,sum)
ans=max(ans,sum)
代码
#include<bits/stdc++.h>
using namespace std;voidfre(){freopen("A.txt","r",stdin);freopen("Ans.txt","w",stdout);}voidFre(){freopen("A.txt","r",stdin);}#define ios ios::sync_with_stdio(false)#define Pi acos(-1)#define pb push_back#define fi first#define se second#define ll long long#define ull unsigned long long #define db double#define Pir pair<int, int>#define PIR pair<Pir, Pir>#define INF 0x3f3f3f3f#define mod 998244353constint mxn =1e5+100;int ar[mxn];intmain(){/* fre(); */int n;scanf("%d\n",&n);for(int i =1; i <= n; i ++)scanf("%d\n",&ar[i]);int ans =0;for(int i =1; i <=30; i ++){int sum =0;for(int j =1; j <= n; j ++){if(ar[j]> i)
sum =0;else{
sum += ar[j];if(sum <0) sum =0;
ans =max(ans, sum - i);}}}printf("%d\n", ans);return0;}
如果存在正整数x令:
x
%
a
r
[
1
]
%
a
r
[
2
]
.
.
.
%
a
r
[
k
]
=
=
~x\%ar[1]\%ar[2]...\%ar[k]==
x%ar[1]%ar[2]...%ar[k]== x按任意顺序区域ar中的元素之后的值,则ar为稳定数组
问有多少选择方案,使产生的 ar 为稳定数组
思路
易得上式的取值结果,有ar中最小的值决定,我设这个最小值为ar1
我们设
x
=
n
∗
a
r
1
+
m
x=n*ar1+m
x=n∗ar1+m,那么m就是表达式最终的取余的结果,接着我们推出
(
n
1
∗
a
1
+
m
)
%
a
r
[
i
]
=
(
n
2
∗
a
r
1
+
m
)
(n1 * a1+m)\%ar[i]=(n2*ar1+m)
(n1∗a1+m)%ar[i]=(n2∗ar1+m),我可以得出ar中任意一个数都要是ar1的倍数,这个样就能保证任意的取余顺序都能保证得到的取余结果相同了,
又因为ar中元素各不相同,所以我们只要枚举 ar1的值,剩下的就是在n/ar[i]-1个ar1的倍数中 选择k个就行了,最终总方案数就是
∑
i
=
1
n
C
n
/
i
−
1
k
−
1
\sum_{i=1}^nC_{n/i-1}^{k-1}
∑i=1nCn/i−1k−1.