2019.7.12
2019.7.12
cf 1159 A
-表示取石头,+表示放石头,问你能放多少个石头?
注意:没有石头也能取石头(神奇),放进去的石头能被取出来。
#include <cstdio>
int main() {
int n;
while(~scanf("%d", &n)) {
int cnt1 = 0;
char a;
for(int i = 0; i < n; i++) {
scanf(" %c", &a);
if(a == '-') {
if(cnt1) cnt1--;
}
else cnt1++;
}
printf("%d\n", cnt1);
}
return 0;
}
cf 1159 B
求k的最大值,就是求min(a[i], a[j]) / abs(i - j)的最少值
题解:把每一个a[i]当作最小值,然后取离他最远的距离当作abs(i-j);
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[3000010];
int main() {
int n;
while(~scanf("%d", &n)) {
memset(a, 0, sizeof(a));
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int k = 0x3f3f3f3f;
for(int i = 0; i < n; i++) {
if(k > a[i] / max(i, n - 1 - i)) k = a[i] / max(i, n - 1 - i);
}
printf("%d\n", k);
}
return 0;
}
cf 1159 C
有n个男孩,m个女孩,第i个男孩至少要派给一个女孩ai个糖果,可以给其他女孩至少ai个糖果。第i个女孩至少收到一个男孩给她bi个糖果,但是每一个男孩都不能给第i个女孩超过bi个糖果。求男孩给出的最少的糖果数。
#include <cstdio>
#include <algorithm>
using namespace std;
int main() {
long long n, m;
while(~scanf("%lld %lld", &n, &m)) {
long long a[100010], b, ans = 0, sum = 0, minn = 0x3f3f3f3f;
for(int i = 0; i < n; i++) {
scanf("%lld", &a[i]);
}
sort(a, a + n);
for(int i = 0; i < m; i++) {
scanf("%lld", &b);
sum += b;
if(b < minn) minn = b;
}
if(a[n-1] > minn) printf("-1\n");
else {
for(long long i = 0; i < n - 1; i++) {
ans += a[i] * m;
}
ans += sum;
if(a[n-1] != minn) {
ans = ans - (minn - a[n-1]);
ans = ans + (minn - a[n-2]);
}
printf("%lld\n", ans);
}
}
return 0;
}
cf 1162A
挺容易理解的一道水题
#include <cstdio>
int main() {
int n, h, t;
while(~scanf("%d %d %d", &n, &h, &t)) {
int vis[55], l, r, x, ans = 0;
for(int i = 1; i <= n; i++) vis[i] = h;
for(int i = 0; i < t; i++) {
scanf("%d %d %d", &l, &r, &x);
for(int j = l; j <= r; j++) {
if(vis[j] > x) vis[j] = x;
}
}
for(int i = 1; i <= n; i++) {
ans += vis[i]*vis[i];
}
printf("%d\n", ans);
}
return 0;
}
cf 1162B
题意:给你两个矩阵,要求你只能交换两个矩阵相同位置的数,问能否使得两个矩阵每一行及每一列单调递增。
题解:把小的数放在a矩阵,把大的数放在b矩阵,最后判断一下两个矩阵是否满足条件就可以了。
#include <cstdio>
int main() {
int n, m;
while(~scanf("%d %d", &n, &m)) {
int a[55][55], b[55][55];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
scanf("%d", &a[i][j]);
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
scanf("%d", &b[i][j]);
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(a[i][j] > b[i][j]) {
int t = a[i][j];
a[i][j] = b[i][j];
b[i][j] = t;
}
}
}
int flag = 0;
if(n == 1) {
for(int j = 0; j < m - 1; j++) {
if(a[0][j+1] <= a[0][j] || b[0][j+1] <= b[0][j]) {
flag = 1;
break;
}
}
}
else if(m == 1) {
for(int i = 0; i < n - 1; i++) {
if(a[i+1][0] <= a[i][0] || b[i+1][0] <= b[i][0]) {
flag = 1;
break;
}
}
}
else {
for(int i = 0; i < n; i++) {
for(int j = 0; j < m - 1; j++) {
if(a[i][j+1] <= a[i][j] || b[i][j+1] <= b[i][j]) {
flag = 1;
break;
}
if(flag) break;
}
}
for(int j = 0; j < m; j++) {
for(int i = 0; i < n - 1; i++) {
if(a[i+1][j] <= a[i][j] || b[i+1][j] <= b[i][j]) {
flag = 1;
break;
}
if(flag) break;
}
}
}
if(flag) printf("Impossible\n");
else printf("Possible\n");
}
return 0;
}
cf 1162C
有很多个杯子,把球放在某一个杯子里。另一个人提问:球是否在第x个杯子里?在一局游戏,你只能把球移动的旁边的杯子或者不移动,只能移动一次,移动的时间可以随意,在另一个人问问题前或后都可以,求球不被询问到的方案数。
#include <cstdio>
#include <cstring>
int main() {
int n, k;
while(~scanf("%d %d", &n, &k)) {
int sta[100010], endd[100010], b;
memset(sta, 0, sizeof(sta));
memset(endd, 0, sizeof(endd));
for(int i = 1; i <= k; i++) {
scanf("%d", &b);
if(sta[b] == 0) sta[b] = i;
endd[b] = i;
}
int ans = 0;
if(sta[1]) {
ans++;
if(sta[2] && sta[2] <= endd[1]) ans++;
}
if(sta[n] && n != 1) {
ans++;
if(sta[n-1] && sta[n-1] <= endd[n]) ans++;
}
for(int i = 2; i < n; i++) {
if(sta[i] == 0) continue;
else {
ans++;
if(sta[i-1] && sta[i-1] <= endd[i]) ans++;
if(sta[i+1] && sta[i+1] <= endd[i]) ans++;
}
}
printf("%d\n", (n - 2) * 3 + 4 - ans);
}
return 0;
}