# D
贪心。当天所需要的原材料如果不够的话从当天及之前中挑选价格最低的一天购买。
### 代码
```cpp
#include <bits/stdc++.h>
using namespace std;
int T, c[1005], pl[1005], ps[1005];
bool buy[1005];
int main() {
scanf("%d", &T);
while(T--) {
priority_queue<int, vector<int>, greater<int> > ss;
int now = 0, ans = 0;
int d, x, s; scanf("%d%d%d", &d, &x, &s);
for(int i=1; i<=d; ++i) {
scanf("%d%d%d", &c[i], &pl[i], &ps[i]);
int minn, mn; minn = pl[i];
for(int j=1; j<=i-1; ++j) if(pl[j] < minn) minn = pl[j];
ans += minn * c[i] * x;
minn = ps[i];
for(int j=1; j<=i-1; ++j) if(ps[j] < minn) minn = ps[j];
while(now < c[i] * s) now += 80, ans += minn;
now -= c[i] * s;
}
printf("%d\n", ans);
}
return 0;
}
```
# E
如果圆的半径比正方形内切圆半径小,则面积为圆的面积。
如果圆的半径比正方形外接圆半径大,则面积为正方形面积。
其他情况
![](http://i1.fuimg.com/642016/d05085b74581a2aa.png)
用圆的面积减去未重合部分面积即为答案
$\theta=acos(\frac{L}{2R})$
$S_1=R*L*sin\theta*\frac{1}{4}$
$S_2=\frac{\theta}{2\pi}*\pi * R^2$
$Ans = \pi*R^2-8*(S_1-S_2)$
### 代码
```cpp
#include <bits/stdc++.h>
using namespace std;
const double pi = 3.14159265358979;
int main() {
int n;
scanf("%d", &n);
for(int i=1; i<=n; ++i) {
int s, r;
scanf("%d%d", &s, &r);
double ans = 0;
if(r * 2 <= s) ans = pi * r * r;
else if(2 * s * s <= 4 * r * r) ans = s * s;
else {
double ss; ss = acos((1.0*s)/(2.0*r)) * r * r * 1.0 / 2.0;
ss -= 1.0 * r * (1.0*s/2) * sin(acos((1.0*s)/(2.0*r))) / 2;
ans = pi * r * r - ss * 8;
}
printf("%.2lf\n", ans);
}
return 0;
}
```
# F
平衡字符串一定满足元音辅音交错出现的形式,那么对于给出的字符串中如果存在已经确定的字母,则字符串中其余的"?"位置也都已经确定了是元音还是辅音,设应当为元音的"?"为$x$个应当为辅音的"?"为$y$个,那么答案为$6^x*20^y$。而对于全部为"?"的字符串,令字符串长度为$N$,则答案为$6^{\lfloor { \frac{N}{2}} \rfloor}*20^{N-\lfloor { \frac{N}{2}} \rfloor}+20^{\lfloor { \frac{N}{2}} \rfloor}*6^{N-\lfloor { \frac{N}{2}} \rfloor}$
注意:不要使用pow函数,自己手写快速幂。
### 代码
```cpp
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int n;
int pd(char x) {
if(x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u' || x == 'y') return 1;
return 0;
}
LL pow(LL a, LL x) {
LL re = 1;
while(x) {
if(x & 1) re = re * a;
a = a * a;
x >>= 1;
}
return re;
}
int main() {
scanf("%d", &n);
for(int i=1; i<=n; ++i) {
printf("String #%d: ", i);
LL ans = 1;
string s;
cin >> s;
int len = s.size();
int p=-1; for(int i=0; i<len; ++i) if(s[i] != '?') {p = i; break;}
if(p==-1) {
int w = len / 2;
// printf("%d %d\n", w, len-w);
ans = pow(6, w) * pow(20, len-w) + pow(6, len-w) * pow(20, w);
}
else {
bool fl[2];
if(((p&1) && (pd(s[p]))) || (!(p&1) && !(pd(s[p])))) fl[0] = 0, fl[1] = 1;
else fl[0] = 1, fl[1] = 0;
LL mul[2] = {20,6};
for(int i=0; i<len; ++i) {
if(s[i] == '?') ans = ans * mul[fl[i&1]];
else if(pd(s[i]) != fl[i&1]) {ans = 0; break;}
}
}
printf("%lld", ans);printf("\n\n");
}
return 0;
}
```
# G
留下一条从(1,1)到(n,n)的路,其余的格子上都可以放上棋子,因为除(1,1)(n,n)外的其他格子只允许放一颗棋子,所以可以放(n-1) * (n-1)个棋子,而第(n-1) * (n-1) + 1 颗棋子作为最后一颗棋子移动至(n,n)其余棋子依次移过去即可,如果比这个再多一个的话,那么最后一颗棋子将无法移动到终点,这样就是无解的。所以如果圆盘个数多于(n-1) * (n-1) + 1的话即为无解,少于或等于的话,答案应为(n-1) * 2 * d.
### 代码
```cpp
#include <bits/stdc++.h>
using namespace std;
int T;
int main() {
scanf("%d", &T);
for(int i=1; i<=T; ++i) {
int d, n;
scanf("%d%d", &d, &n);
printf("Grid #%d: ", i);
int ans = d * ((n - 1) + (n - 1));
if((n-1)*(n-1)+1 < d)printf("impossible\n\n");
else printf("%d\n\n", ans);
}
return 0;
}
```