Problems
A:其实看样例就能看出是求最大公约数*n即可了。因为所有数字减到最后肯定剩下最大公约数。
B:十字架一个个去放,放慢即可。
C:贪心,开始题意都理解错了,还好友大神的鼎力相助(ORZ),理解成第i个上面不能放重量超过Xi,其实是个数不能超过Xi,这样一来就简单了,直接从小箱子从顶部开始放去模拟即可
D:构造问题,给出k,要构造k条路径,先构造两部分路径,如下图,这样一来只要选①的点和②的点去连,路径数就是i * 1 +i * 2 + i * 4 + i * 8 + i * 16....(i = 1或 0) 就能构造出k条路径。
E:贪心,当时5分钟想5分钟敲出来,居然还1发过了,可惜FST了。排序的地方写错了,
大概思路是:贪心,两个人都想用最好的方法去取,那么对于一堆扑克,如果是偶数,肯定是对半拿,奇数肯定有一个人多拿一个,如果有多堆奇数,那么肯定有一半是一个人拿多一个。因为两个人都想拿最优,肯定不会又人占到便宜,最后肯定是一半一半了。问题就在奇数堆上,奇数堆中间那项,肯定是从大到小交替拿的,那只要按中间项排序即可。
代码:
A:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n, num[105], i;
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
int main() {
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
int t = num[0];
for (i = 1; i < n; i++) {
t = gcd(t, num[i]);
}
printf("%d\n", t * n);
return 0;
}
B:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 105;
const int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int n, vis[N][N], ans;
char g[N][N];
bool ju(int x, int y) {
if (x < 0 || x >= n || y < 0 || y >= n) return false;
if (g[x][y] == '.') return false;
for (int i = 0; i < 4; i++) {
int xx = x + d[i][0];
int yy = y + d[i][1];
if (xx < 0 || xx >= n || yy < 0 || yy >= n) return false;
if (g[xx][yy] == '.' || vis[xx][yy]) return false;
}
return true;
}
bool solve() {
int num = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if (ju(i, j)) {
vis[i][j] = 1;
num++;
for (int k = 0; k < 4; k++) {
int xx = i + d[k][0];
int yy = j + d[k][1];
vis[xx][yy] = 1;
num++;
}
}
}
if (num == ans)
return true;
return false;
}
int main() {
ans = 0;
memset(vis, 0, sizeof(vis));
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s", g[i]);
for (int j = 0; j < n; j++)
if (g[i][j] == '#') ans++;
}
printf("%s\n", solve() ? "YES" : "NO");
return 0;
}
C:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
int n, x[105], i, j, ans = 0, blo[105];
int find(int xx) {
for (int i = 0; i < ans; i++)
if (xx >= blo[i])
return i;
return ans++;
}
int main() {
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &x[i]);
sort(x, x + n);
for (i = 0; i < n; i++) {
blo[find(x[i])]++;
}
printf("%d\n", ans);
return 0;
}
D:
#include <stdio.h>
#include <string.h>
const int N = 1005;
int k, g[N][N], i, j;
void make(int now1, int now2, int to1, int to2) {
g[now1][to1] = g[now1][to2] = g[now2][to1] = g[now2][to2] = 1;
}
int main() {
scanf("%d", &k);
g[1][3] = g[3][4] = g[3][5] = 1;
int now1 = 4, now2 = 5, to1 = 6, to2 = 7;
while (to2 < 90) {
make(now1, now2, to1, to2);
now1 += 2; now2 += 2; to1 += 2; to2 += 2;
}
for (i = 100; i < 200; i++)
g[i][i + 1] = 1;
g[200][2] = 1;
for (i = 0; i < 32; i++) {
if (k&(1<<i)) {
g[(i + 2) * 2][i + 100] = 1;
}
}
printf("200\n");
for (i = 1; i <= 200; i++) {
for (j = 1; j <= 200; j++) {
if (g[i][j] || g[j][i]) printf("Y");
else printf("N");
}
printf("\n");
}
return 0;
}
E:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 105;
int n, i, j;
struct Pipe {
int s[N], top, bottom, sum;
} p[N];
bool cmp(Pipe a, Pipe b) {
return a.sum > b.sum;
}
int main() {
memset(p, 0, sizeof(p));
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &p[i].bottom);
for (j = 0; j < p[i].bottom; j++) {
scanf("%d", &p[i].s[j]);
p[i].sum = p[i].s[p[i].bottom / 2];
}
}
sort(p, p + n, cmp);
int ans1 = 0, ans2 = 0, bo = 0;
for (i = 0; i < n; i++) {
if (p[i].bottom % 2== 0) {
for (j = 0; j < p[i].bottom / 2; j++) {
ans1 += p[i].s[j];
}
for (; j< p[i].bottom;j++)
ans2 += p[i].s[j];
}
else {
for (j = 0; j < p[i].bottom / 2 + (bo % 2 == 0); j++)
ans1 += p[i].s[j];
for (;j < p[i].bottom; j++)
ans2 += p[i].s[j];
bo++;
}
}
printf("%d %d\n", ans1, ans2);
return 0;
}