Link:
C:
每次判断增加a/b哪个合法即可
并不用判断两个都合法时哪个更优,因为此时两者答案必定相同
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,a,b,x,y; int main() { scanf("%lld%lld%lld",&n,&a,&b); for(int i=1;i<=n-1;i++) { scanf("%lld%lld",&x,&y); ll a1=((a-1)/x+1)*x,b1=a1/x*y; ll b2=((b-1)/y+1)*y,a2=b2/y*x; if(a1>=a&&b1>=b) a=a1,b=b1; else a=a2,b=b2; } printf("%lld",a+b); return 0; }
D:
又是一道类似构造的题目……
对于每一个$p$先找到一个$g$与其对应保证合法
对这些已经配对的$g$进行改变是没有意义的,毕竟改了这样一个$g$就要再改一个$p$
于是我们发现最优方案是对剩下$cnt(g)-cnt(p)$个$g$中的一半进行更改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; char s[MAXN]; int pp=0,rk=0,len; int main() { scanf("%s",s);len=strlen(s); for(int i=0;i<len;i++) if(s[i]=='p') pp++; else rk++; printf("%d",(rk-pp)/2); return 0; }
E:
直接$hash$暴力就行了?
以后再填……