想給老師跪下哭,嗚嗚嗚,我想上學,我想讀書……
A.獎學金(已AC)
#include <cstdio>
#include <algorithm>
using namespace std;
struct Student {
int id;
int yuwen, shuxue, yingyu;
int sum;
}stu[350];
bool cmp(Student a, Student b) {
if (a.sum != b.sum)
return a.sum > b.sum;
else if (a.yuwen != b.yuwen)
return a.yuwen > b.yuwen;
else
return a.id < b.id;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d %d", &stu[i].yuwen, &stu[i].shuxue, &stu[i].yingyu);
stu[i].id = i+1;
stu[i].sum = stu[i].yuwen + stu[i].shuxue + stu[i].yingyu;
}
sort(stu, stu + n, cmp);
for (int i = 0; i < 5; i++)
printf("%d %d\n", stu[i].id, stu[i].sum);
return 0;
}
B.高次同餘方程求解(已AC)
#include <stdio.h>
int main() {
int k, n;
scanf("%d %d", &k, &n);
for (int i = 1; i <= n; i++) {
int temp = 1;
for (int j = 0; j < k; j++) {
temp = temp * i;
temp %= n;
}
if (temp%n == 1)
printf("%d\n", i);
}
return 0;
}
C.二維數組回形遍歷(已AC)
#include <cstdio>
int a[110][110];
int main() {
int row, col;
scanf("%d %d", &row, &col);
for (int i = 1; i <= row; i++)
for (int j = 1; j <= col; j++)
scanf("%d", &a[i][j]);
int num = row * col;
int beginx = 1, beginy = 1;//beginx,beginy分別表示開始的行和列
while (num > 0) {
//先從右至左輸出第一行
for (int i = beginx, j = beginy; j <= col; j++) {
printf("%d\n", a[i][j]);
num--;
if (num == 0)
return 0;
}
beginx++;
//從上至下輸出最右列
for (int i = beginx, j = col; i <= row; i++) {
printf("%d\n", a[i][j]);
num--;
if (num == 0)
return 0;
}
col--;
//從右至左輸出最下行
for (int i = row, j = col; j >= beginy; j--) {
printf("%d\n", a[i][j]);
num--;
if (num == 0)
return 0;
}
row--;
//從下至上輸出最左列
for (int i = row, j = beginy; i >= beginx; i--) {
printf("%d\n", a[i][j]);
num--;
if (num == 0)
return 0;
}
beginy++;
}
return 0;
}
D.BLACK JACK(不知道對不對,沒搜到題)
#include <cstdio>
int main() {
int an, bn;//我和對方的牌的數量
int anum = 0, bnum = 0;//我和對方的牌中A的數量
int asum = 0, bsum = 0;//我和對方的牌的點數和
bool aflag = false, bflag = false;//我和對方是不是black jack
scanf("%d", &an);
getchar();
for (int i = 0; i < an; i++) {
char temp;
scanf("%c", &temp);
getchar();
if (temp >= '2' && temp <= '9')
asum += temp - '0';
else if (temp == '10' || temp == 'J' || temp == 'Q' || temp == 'K')
asum += 10;
else if (temp == 'A') {
asum += 1;
anum++;
}
}
while (asum <= 11&&anum!=0) {
asum += 10;
anum--;
}
if (an == 2 && asum == 21)
aflag = true;
scanf("%d", &bn);
getchar();
for (int i = 0; i < bn; i++) {
char temp;
scanf("%c", &temp);
getchar();
if (temp >= '2' && temp <= '9')
bsum += temp - '0';
else if (temp == '10' || temp == 'J' || temp == 'Q' || temp == 'K')
bsum += 10;
else if (temp == 'A') {
bsum += 1;
bnum++;
}
}
while (bsum <= 11 && bnum != 0) {
bsum += 10;
bnum--;
}
if (bn == 2 && bsum == 21)
bflag = true;
if (bsum > 21)
printf("win");
else if (asum > 21)
printf("lose");
else if (aflag&&!bflag)
printf("win");
else if (bflag&&!aflag)
printf("lose");
else if (asum > bsum)
printf("win");
else if (asum < bsum)
printf("lose");
else if (asum == bsum)
printf("draw");
return 0;
}
E.我愛學習!
看見題目那幾個WA和TLE我整個人都不好了><
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
string key[25], sen[25];
int main() {
int n, m;
scanf("%d %d", &n, &m);
getchar();
for (int i = 0; i < n; i++)
getline(cin, key[i]);
for (int i = 0; i < m; i++)
getline(cin, sen[i]);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
while (sen[i].find(key[j]) != string::npos) {
int pos = sen[i].find(key[j]);
sen[i].erase(pos, key[j].length());
for (int t = 0; t < key[j].length(); t++)
sen[i].insert(pos, "*");
}
}
cout << sen[i] << endl;
}
return 0;
}
F.水淹七軍
應該是BFS吧?
#include <cstdio>
#include <queue>
#include <string.h>
using namespace std;
const int INF = 0x3fffffff;
int M, N;
int area[210][210];
bool Visit[210][210] = { false };
int X[4] = { 0,0,1,-1 };
int Y[4] = { 1,-1,0,0 };
struct Node {
int x, y;
}T, S,temp;
bool Judge(int x, int y,int h) {
if (x <= 0 || x > M || y <= 0 || y > N)
return false;
if (Visit[x][y] == true)
return false;
if (h <= area[x][y])
return false;
return true;
}
bool BFS() {
queue<Node> q;
q.push(S);
while (!q.empty()) {
Node top = q.front();
q.pop();
if (top.x == T.x&&top.y == T.y)
return true;
int high = area[top.x][top.y];
for (int i = 0; i < 4; i++) {
int Newx = top.x + X[i];
int Newy = top.y + Y[i];
if (Judge(Newx, Newy, high)) {
temp.x = Newx;
temp.y = Newy;
q.push(temp);
area[Newx][Newy] = high;
Visit[Newx][Newy] = true;
}
}
}
return false;
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
bool flag = false;
scanf("%d %d", &M, &N);
memset(area, INF, sizeof(area));
memset(Visit, false, sizeof(Visit));
for (int i = 1; i <= M; i++)
for (int j = 1; j <= N; j++)
scanf("%d", &area[i][j]);
scanf("%d %d", &T.x, &T.y);
int water;
scanf("%d", &water);
while (water--) {
scanf("%d %d", &S.x, &S.y);
if (BFS()) {
flag = true;
break;
}
}
if (flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
G.雞蛋的硬度(已AC)
請參考:NOI庫7627 雞蛋的硬度
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int dp[105][105];
int Cal(int n, int m) {
if (dp[n][m] < 1000)
return dp[n][m];
if (n == 0) {
dp[n][m] = 0;
return dp[n][m];
}
if (n == 1) {
dp[n][m] = 1;
return dp[n][m];
}
if (m == 0) {
dp[n][m] = 0;
return dp[n][m];
}
if (m == 1) {
dp[n][m] = n;
return dp[n][m];
}
for (int i = 1; i <= n; i++)
dp[n][m] = min(dp[n][m], 1 + max(Cal(i - 1, m - 1), Cal(n - i, m)));
return dp[n][m];
}
int main() {
int n, m;
fill(dp[0], dp[0] + 105 * 105, 1000);
while (cin >> n >> m) {
printf("%d\n", Cal(n, m));
}
return 0;
}
H.拓撲排序
優先隊列,不會超時。
注意有重邊的情況(這個大坑哇)
#include <cstdio>
#include <queue>
#include <vector>
#include <string.h>
using namespace std;
priority_queue<int, vector<int>, greater<int> >q;
int map[110][110];
int degree[110] = { 0 };
int main() {
int num, path;
scanf("%d %d", &num, &path);
memset(map, -1, sizeof(map));
for (int i = 0; i < path; i++) {
int a, b;
scanf("%d %d", &a, &b);
if (map[a][b] == -1)
degree[b]++;
map[a][b] = 1;;
}
for (int i = 1; i <= num; i++)
if (degree[i] == 0)
q.push(i);
while (!q.empty()) {
int cur = q.top();
q.pop();
printf("v%d ", cur);
for (int i = 1; i <= num; i++) {
if (map[cur][i] == 1) {
map[cur][i] = 0;
degree[i]--;
if (degree[i] == 0)
q.push(i);
}
}
}
return 0;
}