概述
此篇仅保留一下自己大一大二刷NYOJ时的代码,本人菜鸡一枚,大佬多多包涵。
2-括号配对问题
#include<iostream>
#include<stack>
using namespace std;
int main() {
int t;
cin >> t;
while(t--) {
string str;
cin >> str;
stack<char> s;
for(int i = 0; i < str.size(); i++) {
if(s.empty()) s.push(str[i]);
else if(s.top() == '[' && str[i] == ']') s.pop();
else if(s.top()=='(' && str[i]==')') s.pop();
else
s.push(str[i]);
}
if(s.empty()) cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
1161-3n+1问题
#include<stdio.h>
int main() {
int n, i;
while(scanf("%d", &n) != EOF) {
i = 0;
while(n != 1) {
if(n%2 != 0) {
n = 3*n + 1;
i++;
} else {
n = n / 2;
i++;
}
}
printf("%dn", i%3);
}
return 0;
}
5-Binary String Matching
#include<stdio.h>
#include<string.h>
int main() {
int t;
scanf("%d", &t);
getchar();
while(t--) {
char s[10005], k[15];
scanf("%s%s", k, s);
int lens = strlen(s), lenk = strlen(k), count = 0;
for(int i = 0; i < lens; i++) {
int temp = 1;
for(int j = 0; j < lenk; j++)
if(s[i+j] != k[j]) temp = 0;
count += temp;
}
printf("%dn", count);
}
return 0;
}
6-喷水装置(一)
解法:勾股定理,即每个圆所能覆盖的也就里面的一个矩形而已,将里面的矩形分成4个来看,半径则为三角形的斜边,高为1是一条边,所求a[i]为长这条边,因每个矩形包括两个长的这条边,所以l=20/2,只用算总长一半就行。
代码:
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main() {
int m;
scanf("%d", &m);
while(m--) {
int n, sum = 0;
scanf("%d", &n);
double a[n], l = 20 / 2;
for(int i = 0; i < n; i++) {
scanf("%lf", &a[i]);
a[i] = sqrt(a[i]*a[i] - 1);//勾股定理
}
sort(a, a+n);
int k = n-1;
while(l >= 0) {
l -= a[k--];//先放范围大的
sum++;
}
printf("%dn", sum);
}
return 0;
}
7-街区最短路径问题
解法:二维的投影成一维,住户到邮局距离最小,投影到x和y轴上也就是住户到邮局的x距离和y距离都要最小(构成的斜边也就是两点距离最小) 。
代码:
#include<stdio.h>
#include<stdlib.h>
int find(int a[], int n) {
int min = 0, c[25];
for(int i = 0; i < n; i++) {
c[i] = 0;
for(int j = 0; j < n; j++) {
c[i] += abs(a[j] - a[i]);//i轮流作为邮局点,数组c来统计去i点的距离总和
}
}
for(int i = 0; i < n; i++) {
if (c[i] < c[min]) min = i;//比较出最小距离总和
}
return c[min];
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int a[25], b[25], n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d%d", &a[i], &b[i]);
printf("%dn", find(a, n) + find(b, n));
}
return 0;
}
8-一种排序
#include<stdio.h>
#include<algorithm>
using namespace std;
struct cfx {
int n;
int l;
int w;
} a[1005];
int cmp(cfx x,cfx y) {
if(x.n < y.n) return 1;
if(x.n == y.n && x.l < y.l) return 1;
if(x.n == y.n && x.l == y.l && x.w < y.w) return 1;
else
return 0;
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int m, b, c, i;
scanf("%d", &m);
for(i = 0; i < m; i++) {
scanf("%d%d%d", &a[i].n, &b, &c);
if(b > c) {
a[i].l = b;
a[i].w = c;
} else {
a[i].l = c;
a[i].w = b;
}
}
sort(a, a+m, cmp);
for(i = 0; i < m-1; i++)
if(a[i+1].n == a[i].n && a[i+1].l == a[i].l && a[i+1].w == a[i].w) a[i].n = -1;
for(i = 0; i < m; i++)
if(a[i].n != -1) printf("%d %d %dn",a[i].n, a[i].l, a[i].w);
}
return 0;
}
13-Fibonacci数
#include<stdio.h>
int fib(int n) {
int f1, f2, f;
if (n == 1 || n == 2) return 1;
f1 = f2 = 1;
for (int i = 3; i <= n; i++) {
f = f1 + f2;
f1 = f2;
f2 = f;
}
return f;
}
int main() {
int m;
scanf("%d", &m);
while(m--) {
int n, f, f1, f2;
scanf("%d", &n);
f = fib(n);
printf("%dn", f);
}
return 0;
}
17-单调递增最长子序列
#include<stdio.h>
#include<string.h>
int max(int x, int y) {
return x > y ? x : y;
}
int main() {
int t;
scanf("%d", &t);
getchar();
while(t--) {
int dp[10005] = {0};
char a[10005];
scanf("%s", a);
for(int i = 0; i < strlen(a); i++) {
dp[i] = 1;
for(int j = 0; j < i; j++)
if(a[i] > a[j]) dp[i] = max(dp[i], dp[j]+1);
}
int max = 0;
for(int i = 0; i < strlen(a); i++)
if(dp[i] > max) max = dp[i];
printf("%dn", max);
}
return 0;
}
18-The Triangle
#include<iostream>
#include<algorithm>
using namespace std;
int dp[105][105];
int main() {
int n;
while(cin >> n) {
int a[105][105];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++)
cin >> a[i][j];
for(int i = 1; i <= n; i++)
dp[n][i] = a[n][i];
for(int i = n-1; i >= 1; i--)
for(int j = 1; j <= i; j++)
dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + a[i][j];
cout << dp[1][1] << endl;
}
return 0;
}
19-擅长排列的小明
解法:DFS。
#include<stdio.h>
#include<string.h>
int a[10], b[10], n, m;
void dfs(int pn, int pm) {
if(!pm) {
for(int i = m; i >= 1; i--)
printf("%d", b[i]);
printf("n");
return;
} else {
for(int i = 1; i <= n; i++) {
if(a[i] != 1) {
b[pm] = i;
a[i] = 1;
dfs(pn, pm-1);
a[i] = 0;
}
}
}
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &m);
memset(a, 0, sizeof(a));
dfs(n, m);
}
return 0;
}
20-吝啬的国度
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
static Vector<Integer>[] m;
static Queue<Integer> q;
static int[] pre;
public static InputReader in = new InputReader(new BufferedInputStream(System.in));
public static PrintWriter out = new PrintWriter(System.out);
public static void main(String[] args) throws IOException {
int t = in.nextInt();
while (t-- > 0) {
int n = in.nextInt(), pos = in.nextInt();
pre = new int[n + 1];
m = new Vector[n + 1];
for (int i = 0; i < n + 1; i++) {
m[i] = new Vector<>();
}
q = new LinkedList<>();
for (int i = 0; i < n - 1; i++) {
int a = in.nextInt(), b = in.nextInt();
m[a].add(b);
m[b].add(a);
}
bfs(pos);
for (int i = 1; i <= n; i++) {
out.print(pre[i] + " ");
out.flush();
}
out.println();
out.flush();
}
}
private static void bfs(int pos) {
pre[pos] = -1;
q.add(pos);
while (!q.isEmpty()) {
int k = q.poll();
for (int i = 0; i < m[k].size(); i++) {
if (pre[m[k].get(i)] == 0) {
pre[m[k].get(i)] = k;
q.add(m[k].get(i));
}
}
}
}
static class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
}
public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public String nextLine() {
String str = null;
try {
str = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
public Double nextDouble() {
return Double.parseDouble(next());
}
public BigInteger nextBigInteger() {
return new BigInteger(next());
}
}
}
23-取石子(一)
#include<stdio.h>
int main() {
int t;
scanf("%d", &t);
while(t--) {
int n, m;
scanf("%d%d", &n, &m);
if(n < m) printf("Winn");
else if(n % (m + 1) == 0) printf("Losen"); //给对手留下 m+1 的倍数 则会赢
else
printf("Winn");
}
return 0;
}
24-素数距离问题
#include<stdio.h>
int primer(int t) {
for(int j = 2; j*j <= t; j++) {
if(t % j == 0) {
return 0;
}
}
return 1;
}
int main () {
int n;
scanf("%d", &n);
while(n--) {
int m, i, j, big, small;
scanf("%d", &m);
if(m == 0) printf("2 2n");
else if(1 == m) printf("2 1n");
else if(2 == m) printf("2 0n");
else {
if(primer(m)) {//若输入的数为素数
printf("%d 0n", m);
} else { //若输入的数不是素数
for(i = m+1; ; i++) {
if(primer(i)) {
big = i;
break;
}
}
for(i = m-1; ; i--) {
if(primer(i)) {
small = i;
break;
}
}
if(m-small <= big-m) printf("%d %dn", small, m-small);
else
printf("%d %dn", big, big-m);
}
}
}
return 0;
}
29-求转置矩阵问题
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
while(n--) {
int a[3][3];
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++)
printf("%d ", a[j][i]);
printf("n");
}
printf("n");
}
return 0;
}
32-组合数
#include<stdio.h>
int n, r;
int num[15];//用数组来存某次循环时的几位数
void dfs(int a, int b) {
if(b == 0) {//b递减到0,数组中有b个数存放着,停止递归,开始输出
for(int i = r; i > 0; i--)
printf("%d", num[i]);
printf("n");
} else {
for(int i = a; i >= b; i--) {
num[b] = i;//b个数;第一次循环是第一个数,为最大值,后递减
dfs(i-1, b-1);//递归,同时改变a与b的值,依次用数组存放第n个数
}
}
}
int main() {
scanf("%d%d", &n, &r);
dfs(n, r);
return 0;
}
34-韩信点兵
#include<stdio.h>
int main() {
int s;
int a, b, c, f = 0;
scanf("%d%d%d", &a, &b, &c);
for(s = 10; s <= 100; s++) {
if((a==s%3)&&(b==s%5)&&(c==s%7)) {
f = 1;
}
if(f == 1)break;
}
if(f == 1)printf("%d", s);
else
printf("No answer");
return 0;
}
36-最长公共子序列
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[1005][1005];
int main() {
int t;
cin >> t;
while(t--) {
char str1[1005], str2[1005];
cin >> str1 >> str2;
int n = strlen(str1), m = strlen(str2);
for(int i = 0; i < n; i++)
dp[i][0] = 0;
for(int j = 0; j < m; j++)
dp[0][j] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(str1[i-1] == str2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
}
}
cout << dp[n][m] << endl;
}
return 0;
}
40-公约数和公倍数
#include<stdio.h>
int gcd(int m, int n) {
if(m % n == 0)
return n;
else
return gcd(n,m%n);
}
int main() {
int m, n, N;
scanf("%d", &N);
while(N--) {
scanf("%d%d", &m, &n);
printf("%d %dn", gcd(m, n), m * n / gcd(m, n));
}
return 0;
}
42-一笔画问题
#include<bits/stdc++.h>
using namespace std;
int ditu[1005][1005] = {0}, tot, p;
int vis[1005] = {0};
void dfs(int k) {//从1号顶点开始dfs
vis[k] = 1;
tot++;
for(int i = 1; i <= p; i++)
if(ditu[k][i] == 1 && !vis[i]) dfs(i);
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
memset(ditu, 0, sizeof(ditu));
memset(vis, 0, sizeof(vis));
int q, a[1005] = {0}, d1, d2, sum = 0;
scanf("%d%d", &p, &q);
tot = 0;
for(int i = 0; i < q; i++) {
scanf("%d%d", &d1, &d2);
ditu[d1][d2] = ditu[d2][d1] = 1;
a[d1]++;
a[d2]++;
}
for(int i = 1; i <= p; i++)
if(a[i] % 2) sum++;
if(sum == 0 || sum == 2) {
dfs(1);
if(tot == p) printf("Yesn");
else
printf("Non");
}else{
printf("Non");
}
}
return 0;
}
44-子串和
#include<stdio.h>
int main() {
int t;
scanf("%d", &t);
while(t--) {
int a, n, max, sum = 0;
scanf("%d", &n);
scanf("%d", &a);
max = a; //先定义初始最大值为第一个数
for(int i = 1; i < n; i++) {
sum += a;//sum先加上第一个数因为后续同一变量输入会覆盖前面的数,开头数字为负或者正数加了一个负数,使sum可能为负
if(sum > max) max = sum;//更新最大值
else if(sum < 0) sum = 0;//相加的过程中遇到负数使sum变小不要紧,一旦sum为负则重新开始计和(sum为负则之前一串的数都可以不用再加来参与计和了)
scanf("%d", &a);
}
printf("%dn", max);
}
return 0;
}
DP做法:
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1000002] = {0}, dp[1000002] = {0};//dp[i]表示取第i个元素时子串的和,即考虑a[i]是作为最大串的开头元素还是结尾元素
int main() {
int n,m;
scanf("%d", &n);
while (n--) {
scanf("%d", &m);
for (int i = 0; i < m; i++)
scanf("%d", &a[i]);
dp[0] = a[0];//初始化dp为第一项最大
for (int i = 1; i < m; i++) {
dp[i] = max(a[i], dp[i-1]+a[i]);//max(让a[i]为新起点重新组串,a[i]与前面的串组合在一起)
}
sort(dp, dp + m);//排序后取最后一个即是最大的子串和
printf("%dn", dp[m - 1]);
}
return 0;
}
49-开心的小明
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[30005];
int main() {
int t;
cin >> t;
while(t--) {
memset(dp, 0, sizeof(dp));
int v[30], w[30], a[30], n, m;
cin >> n >> m;
for(int i = 0; i < m; i++) {
cin >> v[i] >> w[i];
a[i] = v[i] * w[i];
}
for(int i = 0; i < m; i++)//外层是物品
for(int j = n; j >= v[i]; j--)//里层是资金,算每个资金能包含多少物品
dp[j] = max(dp[j-v[i]] + a[i], dp[j]);//拿v[i]跟不拿比较dp大小
cout << dp[n] << endl;
}
return 0;
}
51-管闲事的小明
解法:贪心策略,排序后,先统计完一个区间的,再通过改变后一区间的起点或终点来统计后面的。
吐槽:新版OJ好像不能编译algorithm了......
#include<bits/stdc++.h>
using namespace std;
struct moveq {
int start, end;
}s[105];
bool cmp(moveq a, moveq b) {
if(a.start < b.start) return true;
else if(a.start == b.start && a.end > b.end) return true;
else
return false;
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int l, m, count = 0;
scanf("%d%d", &l, &m);
for(int i = 0; i < m; i++)
scanf("%d%d", &s[i].start, &s[i].end);
sort(s, s+m, cmp);
int max = -1;//不断变换终点位值,定义初始终点位置为-1,使得第一区间能统计到
for(int i = 0; i < m; i++) {
if(s[i].end < max) continue;//如果后一区间的终点位置小于前一区间终点位置,则后一区间不需要重复算了
if(s[i].start > max) count += s[i].end - s[i].start + 1;//如果后一区间的起点大于前一区间终点位置,则直接算后一区间的
else
count += s[i].end - max;
max = s[i].end;//不断更新为前一区间的终点位置
}
printf("%dn", l - count + 1);
}
return 0;
}
区间数组做法:
#include<stdio.h>
int main() {
int t;
scanf("%d", &t);
while(t--) {
int l, m, sum = 0, a[10005] = {0};
scanf("%d%d", &l, &m);
while(m--) {
int start, end;
scanf("%d%d", &start, &end);
for(int i = start; i <= end; i++)
a[i] = 1;
}
for(int i = 0; i <= l; i++)
if(a[i] == 0) sum++;
printf("%dn", sum);
}
return 0;
}
53-不高兴的小明
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
while(n--) {
int a[7], b[7], k, max = 0, t = 0;
for(int i = 0; i < 7; i++) {
scanf("%d%d", &a[i], &b[i]);
if(a[i] + b[i] > max) {
k = i + 1;
max = a[i] + b[i];
}
if(a[i] + b[i] > 8) t = 1;
}
if(t == 0) printf("0n");
else
printf("%dn", k);
}
return 0;
}
54-小明的存钱计划
#include<stdio.h>
int main() {
int t;
scanf("%d", &t);
while(t--) {
int sum = 0, a[15], k, temp = 0, flag = 0;
for(int i = 0; i < 12; i++)
scanf("%d", &a[i]);
for(int i = 0; i < 12; i++) {
temp = temp + 300 - a[i];
if(temp < 0) {
flag = 1;
k = i + 1;
break;
} else {
sum += temp / 100;
temp = temp % 100;
}
}
if(flag) printf("-%dn", k);
else
printf("%.lfn", (double)(sum * 120 + temp));
}
return 0;
}
57-6174问题
#include<stdio.h>
#include<algorithm>
using namespace std;
int main() {
int t;
scanf("%d", &t);
while(t--) {
int n, s[4], k, count = 1;
scanf("%d", &n);
k = n;
while(k != 6174) {//由题目给出的特定值,并不是所有数都能结束循环
s[0] = k % 10;
s[1] = k % 100 / 10;
s[2] = k / 100 % 10;
s[3] = k / 1000;
sort(s, s + 4);
int a = 0, b = 0;
for(int i = 3; i >= 0; i--) {
a = a * 10 + s[i];
}
for(int i = 0; i < 4; i++) {
b = b * 10 + s[i];
}
k = a - b;
count++;
if(k == n) break;
}
printf("%dn", count);
}
return 0;
}
58-最少步数
#include<iostream>
#include<cstring>
using namespace std;
int dir[4][2]= {0, 1, 0, -1, 1, 0, -1, 0}, x1, y1, x2, y2, minn, sum;
int visited[110][110]; // 访问标记
int map[9][9] = {1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,1,0,1,
1,0,0,1,1,0,0,0,1,
1,0,1,0,1,1,0,1,1,
1,0,0,0,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,0,0,0,1,
1,1,1,1,1,1,1,1,1
};
int CheckEdge(int x, int y) {
if(!visited[x][y] && !map[x][y] && x > 0 && x <= 9 && y > 0 && y <= 9) return 1;
else
return 0;
}
void dfs(int x, int y) {
if(x == x2 && y == y2) {//到达终点
if(sum < minn) minn = sum;
return;
}
if(!visited[x][y]) {//该点没被搜索过
visited[x][y] = 1;
sum++;
for(int i=0; i<4; i++)
if(CheckEdge(x+dir[i][0], y+dir[i][1])) dfs(x+dir[i][0],y+dir[i][1]);// 按照规则生成下一个节点
visited[x][y] = 0;//四个方向都不能走,该点为死路
sum--;
}
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
scanf("%d%d", &x1, &y1);
scanf("%d%d", &x2, &y2);
memset(visited, 0, sizeof(visited));
minn = 81;
sum = 0;
dfs(x1, y1);
printf("%dn", minn);
}
return 0;
}
60-谁获得了最高奖学金
#include<stdio.h>
struct student {
char name[25];
int score;
int bscore;
char g;
char b;
int l;
int sum;
} st[105];
int main() {
int n;
scanf("%d", &n);
while(n--) {
int x;
scanf("%d", &x);
getchar();
int max = 0, zong = 0, t = x;
while(x--) {
scanf("%s%d%d", st[x].name, &st[x].score, &st[x].bscore);
getchar();
scanf("%c %c%d", &st[x].g, &st[x].b, &st[x].l);//要想达到多组数组输入,即使两个字符输入时有空格了,在代码时两个字符输入之间必须多一个空格
getchar();
st[x].sum = 0;
if(st[x].score > 80 && st[x].l >= 1) st[x].sum += 8000;
if(st[x].score > 85 && st[x].bscore > 80) st[x].sum += 4000;
if(st[x].score > 90) st[x].sum += 2000;
if(st[x].score > 85 && st[x].b == 'Y') st[x].sum += 1000;
if(st[x].bscore > 80 && st[x].g == 'Y') st[x].sum += 850;
zong += st[x].sum;
if(st[x].sum > max) {
max = st[x].sum;
t = x;//记录最高奖学金学生的下标
}
}
printf("%sn%dn%dn", st[t].name, st[t].sum, zong);
}
return 0;
}
62-笨小熊
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
bool prime(int n) {
if(n <= 1) return false;
for(int i = 2; i * i <= n; i++)
if(n % i == 0) return false;
return true;
}
int main() {
int t;
scanf("%d", &t);
getchar();
while(t--) {
int maxn = 0, minn = 0, a[26] = {0};
char s[100];
gets(s);
for(int i = 0; i < strlen(s); i++) {
a[(s[i] - '0') - 49]++;//先变成字母的ASCII码
}
sort(a, a + 26);
maxn = a[25];
for(int i = 0; i < 26; i++) {
if(a[i] != 0) {
minn = a[i];
break;
}
}
if(prime(maxn - minn)) {
printf("Lucky Wordn%dn", maxn - minn);
} else {
printf("No Answern0n");
}
}
return 0;
}
67-三角形面积
#include<stdio.h>
#include<math.h>
int main() {
int x1, x2, x3, y1, y2, y3;
while(~scanf("%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3)) {
double a1, a2, a3, s, p;
if(x1==0&&x2==0&&x3==0&&y1==0&&y2==0&&y3==0) break;
a1 = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
a2 = sqrt((x1-x3)*(x1-x3) + (y1-y3)*(y1-y3));
a3 = sqrt((x3-x2)*(x3-x2) + (y3-y2)*(y3-y2));
p = (a1 + a2 + a3) / 2;
s = sqrt(p * (p - a1) * (p - a2) * (p - a3));
printf("%.1lfn", s);
}
return 0;
}
69-数的长度
#include<stdio.h>
#include<math.h>
int main() {
int n;
scanf("%d", &n);
while(n--) {
int N;
double t = 0;
scanf("%d", &N);
for(int i = 1; i <= N; i++)
t += log10(i);
printf("%dn", (int)t + 1);
}
return 0;
}
70-阶乘因式分解(二)
题目意思:
n的阶乘中最多能分解出多少个m相乘
例如:n=100 m=5;
100当中有
5,10,15,20,25,30,35,40,45,50,
55,60,65,70,75,80,85,90,95,100
这些数能够整除5,其中25,50,75,100能够整除5^2,即能够整除25,因此可以分解出2个5。又因为第一遍时已经加过一次了,所以最多能够分解出20+4个5。
#include<stdio.h>
int main() {
int s;
scanf("%d", &s);
while(s--) {
int n, m, sum = 0;
scanf("%d%d", &n, &m);
while(n) {
sum += n / m;//计算n中有多少个能整除m的数;
n /= m; //计算n中有多少个能够整除m^2的数;
}
printf("%dn",sum);
}
return 0;
}
71-独木舟上的旅行
#include<stdio.h>
#include<algorithm>
using namespace std;
int main() {
int t;
scanf("%d", &t);
while(t--) {
int w, n, a[305], count;
scanf("%d%d", &w, &n);
count = n;
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
sort(a, a + n);
int j = 0;
for(int i = n - 1; i > j; i--) {
if(a[i] + a[j] <= w) {//小的先不动,让大的逐一来凑
count--;
j++;
}
}
printf("%dn", count);
}
return 0;
}
72-Financial Management
#include<stdio.h>
int main() {
double a[12], s = 0;
for(int i = 0; i < 12; i++) {
scanf("%lf", &a[i]);
s += a[i];
}
printf("%.2lf", s / 12);
return 0;
}
74-小学生算术
#include<stdio.h>
int main() {
int m, n;
while(scanf("%d%d", &m, &n)) {
if(m == 0 && n == 0) break;
int a, b, c, d, e, f, g = 0, k = 0, i = 0;
a = m / 100;
b = m / 10 % 10;
c = m % 10;
d = n / 100;
e = n / 10 % 10;
f = n % 10;
if(c + f >= 10) {
i++;
g = 1;
}
if(b + e + g >= 10) {
i++;
k = 1;
}
if(a + d + k >= 10) i++;
printf("%dn", i);
}
return 0;
}
76-超级台阶
解法:找规律,其实就是斐波那契数列,反过来看,假设从第n阶往第1阶走。f(n)代表可能的次数,可以走1阶也可以走2阶,所以f(n)=f(n-1)+f(n-2)。
注意不能用递归,因为时间会超,m可以取40,计算时间太长了,只能先打表,再对应打印出来。
递归超时, 迭代不会。这个就是斐波那契数列的递推公式了。
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
while(n--) {
int m, a[45];
a[1] = 0;
a[2] = 1;
a[3] = 2;
scanf("%d", &m);
for(int i = 4; i <= m; i++) {
a[i] = a[i-1] + a[i-2];
}
printf("%dn", a[m]);
}
return 0;
}
79-拦截导弹
解法:动态规划,单调递减子序列长度。
#include<stdio.h>
#include<algorithm>
using namespace std;
int dp[25];
int main() {
int t;
scanf("%d", &t);
while(t--) {
int m, a[25], maxn = 0;
scanf("%d", &m);
for(int i = 0; i < m; i++)
scanf("%d", &a[i]);
for(int i = 0; i < m; i++) {//终点位置
dp[i] = 1;
for(int j = 0; j < i; j++)
if(a[i] < a[j]) dp[i] = max(dp[i], dp[j]+1);
maxn = max(dp[i], maxn);
}
printf("%dn", maxn);
}
return 0;
}
88-汉诺塔(一)
解法:对于汉诺塔求移动次数公式为f(n+1)=f(n)*2+1。
#include<stdio.h>
long long Solve(int n) {
if(n == 1) return 2;
long long t;
t = Solve(n/2);
if(n % 2 == 0) return ((t%1000000) * (t%1000000)) % 1000000;
else
return (2 * (t%1000000) * (t%1000000)) % 1000000;
}
int main() {
int n;
scanf("%d", &n);
while(n--) {
int m;
scanf("%d", &m);
printf("%lldn", Solve(m)-1);
}
return 0;
}
90-整数划分
#include<iostream>
using namespace std;
int dp[20][20];
int main() {
int t;
cin >> t;
while(t--) {
int n;
cin >> n;
for(int i = 1; i <= n; i++) {//基层状态初始化
dp[i][1] = 1;
dp[1][i] = 1;
}
for(int i = 2; i <= n; i++) {
for(int j = 2; j <= n; j++) {
if(i == j) dp[i][j] = dp[i][j-1] + 1;//dp[i][j]=dp[i][j-1]+1,加上i由单独一个i构成的这一种情况。
else if (i < j) dp[i][j] = dp[i][i];//j超过i的数没有用,所以dp[i][j]=dp[i][i];
else
dp[i][j] = dp[i][j-1] + dp[i-j][j];//可以分为取j和不取j的情况,若不取j,dp[i][j]=dp[i][j-1],取j时(i可能由多个相同的j构所以j不用变化),dp[i][j]=dp[i-j][j]
}
}
cout << dp[n][n] << endl;
}
return 0;
}
91-阶乘之和
解法:9的阶乘是36万多,题目给出的n小于100万,所以只能是由10以下的数阶乘想加组成的。
#include<iostream>
using namespace std;
int jiecheng(int i) {
int sum = 1;
for(int j = 1; j <= i; j++)
sum *= j;
return sum;
}
int main() {
int m;
cin >> m;
while(m--) {
int n;
cin >> n;
for(int i = 9; i > 0; i--) {
if(n >= jiecheng(i)) n -= jiecheng(i);//逐一阶乘相减,减到最后为0则刚好是由某些阶乘组成的
}
if(n == 0) cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
93-汉诺塔(三)
#include<iostream>
#include<stack>
using namespace std;
int main() {
int n;
cin >> n;
while(n--) {
stack<int> s[3];//数组栈,模仿汉诺塔的三根针,三个栈
int p, q;//层数与指令条数
int a, b;//接收指令
bool flag = 0;//若有非法指令,就标记为1
cin >> p >> q;
for(int i = p; i > 0; i--)
s[0].push(i);//压栈
while(q--) {
cin >> a >> b;
if(s[a-1].empty()) flag = 1;//如果栈s[a-1]即针是空的,那指令就是非法
else if(!s[b-1].empty() && s[a-1].top() > s[b-1].top()) flag=1;//栈s[b-1]也不是空的,而且从大往小移,也是非法指令
if(flag == 0) {
s[b-1].push(s[a-1].top());//栈s[a-1]的栈顶赋值到栈s[b-1]
s[a-1].pop();//并删除栈s[a-1]的栈顶
}
}
if(flag) cout << "illegaln";
else
cout << "legaln";
}
return 0;
}
94-cigarettes
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
while(n--) {
int m, k;
scanf("%d %d", &m, &k);
printf("%dn", m + (m-1) / (k-1));
}
return 0;
}
100-1的个数
#include<stdio.h>
int main() {
int N;
scanf("%dn", &N);
while(N--) {
int n, a[100], k = 0;
scanf("%d", &n);
while(n) {
a[k++] = n % 2;
n = n / 2;
}
int t = 0;
for(int i = k - 1; i >= 0; i--)
if(a[i] == 1) t++;
printf("%dn", t);
}
return 0;
}
101-两点距离
#include<stdio.h>
#include<math.h>
int main() {
int n;
double a, b, c, d, x, y;
scanf("%d", &n);
while(n--) {
scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
x = a - c;
y = b - d;
printf("%.2lfn", sqrt(x*x + y*y) );
}
return 0;
}
102-次方求模
/*
*
* UM.
* J@B@1 iO@1
* Y@@@B@BB. 7B@B@B@
* :@B@i,B@B@O ,Z@B@B@B@Br
* @B@q i@B@BS 7@B@@@O5vMB@q
* 8@@B LB@B@i FB@@@BNjYjLE@B@
* ,B@B: 0@@@Z P@B@BM1JJ125JPB@B
* B@BB :@B@B XB@B@Z2LuU52F2u2@B@.
* :@B@ @@@B: v@B@B8uJj51F1525uUB@B7
* @B@O 0@@B. ..::ir7vvYUuU777r::. B@B@OULU2F2F151F11Y@B@S
* B@B, 8B@B :ruXMB@B@B@B@B@B@B@B@B@B@@@B@B@B@B@B@B@5Jj1211F1F1F2FUJO@BB
* U@B@ @B@B@B@B@B@@@B@B@B@MMqPS5JuYL7rq@B@OBB@B@B8Yu211F1515251515YGB@@
* @B@u v@@@@MSur:. LB@MvvjJuU5YU252F1F1F25251F2uX@@@
* @@@. N@BML2U2UUU12F15252525251515Jk@@B
* r@B@ YB@Bju52121252515252F15251F2u5@B@
* PB@B @@@PYUF151F25151F152F2F1F15jF@@B
* @@BS N@@@UJ2F25252F251525151F1F1u5@B@
* @@@7 B@B@5Yj12F152F1F1F25252515jFB@B
* B@Bi M@B@O2Luu52525212F151121UY1@B@7
* O@B@: v@B@BMSuYJJuuUu2u2uujjYJJXB@B@M
* 7B@B@, 1B@@@B@GPF1uujuu21PNMB@B@B@B@@
* qB@B2 i8B@B@B@B@B@@@@@B@B@B@q: @@@B
* MB@B: 7SBB@B@B@B@B@Zu: @B@B
* ZB@B. ,v. @B@L
* LB@B, Y7 @B@Bu 7@B@
* :B@B@@B2: @@B7 @B@Z r@B@B@BP: B@BE
* BB@@@B@B@B@BE r@B@B 7@B@B@B@Ou: iB@B
* :uM@@B@@2. :7::::ivk@B@B@0 :5B@B@B@B@B@B@G. @B@i
* BB@@@B@@ :@B@B@@@B@B@@1 .i5M@B@B@@@5 M@@2
* B@B ,@B1 L0EZZG0F7: .:, uB@MrP@M7
* 2@B@ ,O@B@B@B@B
* @B@1 :@B@@@r :@@@@B@BL:,,
* B@Bi :2ZS; :@B@B@B@r L@B@B@BU
* @B@. @@@B@B@ vB@B@B@B5 @B@i
* B@B 7B@B@B@BM OB@B@B@ ,B@B
* @B@ @B@B@@@i rL7. B@BM
* B@B7.: NB@@M. .@B@.
* .;JEB@@@B@B@B@B@. . @B@u
*@@@B@B@B@B@@@B@18U :B@B@B@BU,
*7@BOui. ,@@B SP@B@B@B@B@Or
* @@@U B@BJ.YO@B@B@i
* r@B@ :B@Bk .k@B@
* B@B@ LB@@k 2i
* B@BM .7jXEGqF7: OB@@L
* .B@BM .B@B@B@B@B@B@. :@B@B:
* .B@B@ @@MYr::ivG@B .M@B@G
* B@@@S ,MB@B@,
* v@@@BF .1B@B@Br
* 2@@B@BL ,FB@@@B8,
* r@B@B@BF, :YBB@B@B@B
* L@B@B@B@P7, .ivXB@B@B@B@B@M@B@
* ,1B@B@B@B@@@BOP2L7i:,. ..,:i7LSNB@@B@B@@@B@B@B@Z5v;.LB@@
* @B@OEB@B@@@B@B@B@B@B@B@B@B@@@B@B@B@B@B@@@B@B@B@B@BM0SJ7i::::i:,u@B@
* B@Bu ::i;7vu2XNGOMB@B@BMB@B@B@B@B@B@@@B1UFuj77ii:::::::iir;r;i.YB@B
* @B@L.:i:i:i::::::::::..Y@B@BMYi:i;SB@B@N:.::i:iirir;r;rii::::ivO@B@
* B@@X::,::::iirir;riri:E@B@1 ,@B@Br:;;r;rii:i::::i7JEB@@@@@B
* @@@B@BBq5v7ii:::::::.2@@@i ..,.. @B@@,,:::::irv2XMB@B@B@B@2@B@:
* .B@BBB@@@B@B@B@BMNP5u7@B@1 .,,:,, :. @B@P50MB@B@B@B@B@@@BS: @@B1
* E@B@ ijGB@B@B@B@B@B@B@Bi .,:,,..@@B@7 B@B@B@B@B@B@BM57. kB@B
* .@B@: .,ivu5Nq@B@u ..,.. SB@B@@@B@PL7i, ,@B@
* @@@8 i@B@: . :B@B@@ B@@2
* i@@@@ 0@B@u B@@B. vB@B
* ,@B@G L@B@BOv:.:iFB@B@M @B@Bi
* vNi S@@B@B@B@B@BM: MB@N
* 758BMqJ,
*
* . YO. vq :G Z:
* SqOMBB@B@Br @@r rBE @B B@@@@@B@ONX8k i::::.OB1.:::.u@O.::::i @B@B@U:@@B@@BPEBu
* B@@NB@k. 5@i uB@E. BM 1U2uUJvirB@@Z r@@B@B@@@B@B@B@B@B@@@B@Bi LB@B@1 BX :@k uLLLvr@BJ:
* iB iBi 7@ .@M8@BGMZZ @@F ,B Pi v@ Bq @i v@ B@
* vuL7r8@S7vJL7N@Z7LLri;72. F7@Bvvv@@ @BX @@@B@B@@@@@B@@@B@B@B 7@ @F Bi @q @B@Bu @B
* N@B@G@@@8@BBOMB@G@BMNXG@, B@ @@ .Bk .:u; i@: Zv 7@ Bk @,;@ ,BY @B B@
* r@ @G 5. ,@v BZ :::,.r@E .::i, @B B@ .@BL 7@ @F B:i@. .@ @M @B
* 7B: ,vO, @@ iB@: @B 7@:MB@B@B@@@B@B@BM @@. B: 2@q 7@ BS @i 0@ B. @O B@
* ,r2EBB@B@B@Bi G@ @BB B@ @B @S : r@ .. 7B @F @7 B7 @ @B @B
* E@B@UOBr @B@Bi L@0PB .BZ .@B@B@B@B@B@B@B@B@B@B@B@, r@ BF @i @G B@B@B B@
* 7@, kB@U ;r @@@. .@Z GBuL@iBBi vB@B@q BP:5@7 @u,. @B
* LBi YB@BrB@ @@ @B:L@Br BM .M@B rB rB@J v@. Pi @XZ8r . B@
* . G@i B@BM. ,B@, @B iB@B N, 7r..q@k ,LB@B8 J@, i@B@B1r Br @@
* MB@B@B ,i B@B@B, B@: @B@B@F .@BB: P@i :OBZ .@U B@B@B:
* .ll rB. :
*
*/
import org.omg.CosNaming.BindingHelper;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
public static InputReader in = new InputReader(new BufferedInputStream(System.in));
public static PrintWriter out = new PrintWriter(System.out);
public static void main(String[] args) {
int t = in.nextInt();
while (t-- > 0) {
BigInteger a = in.nextBigInteger();
BigInteger b = in.nextBigInteger();
BigInteger c = in.nextBigInteger();
out.println(a.modPow(b, c));
out.flush();
}
out.close();
}
static class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
}
public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public String nextLine() {
String str = null;
try {
str = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
public Double nextDouble() {
return Double.parseDouble(next());
}
public BigInteger nextBigInteger() {
return new BigInteger(next());
}
}
}
106-背包问题
#include<stdio.h>
struct beibao {
int v, w;
} b[15];
int main() {
int n;
scanf("%d", &n);
while(n--) {
int s, m, sum = 0;
struct beibao t;
scanf("%d%d", &s, &m);
for(int i = 0; i < s; i++)
scanf("%d%d", &b[i].v, &b[i].w);
for(int i = 0; i < s; i++) {
for(int j = i + 1; j < s; j++) {
if(b[j].v > b[i].v) {//排序,将该物品单位重量的价值从大到小排
t = b[j];
b[j] = b[i];
b[i] = t;
}
}
}
for(int i = 0; i < s; i++) {
if(m < b[i].w) {
sum += b[i].v * m;//超重时,加部分该物品,即单位重量价值乘以剩余空间 (物品可以分割)
break;
} else {
sum += b[i].v * b[i].w;//还未超重时,加全部该物品,即单位重量价值乘以总重量
m -= b[i].w;
}
}
printf("%dn", sum);
}
return 0;
}
108-士兵杀敌(一)
#include<stdio.h>
int main() {
int N, M, n, m;
scanf("%d%d", &N, &M);
int a[N], sum[N];
for(int i = 0; i < N; i++) {
scanf("%d", &a[i]);
if(i == 0) sum[i] = a[i];
else if(i >= 1) sum[i] = sum[i-1] + a[i];
}
while(M--) {
scanf("%d%d", &m, &n);
if(m == 1) printf("%dn", sum[n-1]);
else
printf("%dn", sum[n-1]-sum[m-2]);
}
return 0;
}
111-分数加减法
#include<stdio.h>
int gcd(int m, int n) {
return n == 0 ? m : gcd(n, m%n);
}
int main() {
int a, b, c, d;
char ch;
while(~scanf("%d/%d%c%d/%d", &a, &b, &ch, &c, &d)) {
int fenzi, fenmu;
fenmu = b * d / gcd(b, d);
if(ch == '+') {
fenzi = a * fenmu / b + c * fenmu / d;
if(fenzi == 0) printf("0n");
else if(fenzi % fenmu == 0) printf("%dn", fenzi / fenmu);
else
printf("%d/%dn", fenzi / gcd(fenzi, fenmu), fenmu / gcd(fenzi, fenmu));
} else {
fenzi = a * fenmu / b - c * fenmu / d;
if(fenzi == 0) printf("0n");
else if(fenzi % fenmu == 0) printf("%dn", fenzi / fenmu);
else {
if(fenzi < 0) {
fenzi = -fenzi;
printf("-%d/%dn", fenzi / gcd(fenzi, fenmu), fenmu / gcd(fenzi, fenmu));
} else
printf("%d/%dn", fenzi / gcd(fenzi, fenmu), fenmu / gcd(fenzi, fenmu));
}
}
}
return 0;
}
113-字符串替换
#include<stdio.h>
#include<string.h>
int main() {
char s[1005];
while(gets(s)) {
int l = strlen(s);
for(int i = 0; i < l - 2; i++) {
if(s[i] == 'y'&& s[i + 1] == 'o'&& s[i + 2] == 'u') {
s[i] ='w';
s[i + 1] = 'e';
s[i + 2] = '0';
}
}
for(int i = 0; i < l; i++) {
if(s[i] != '0') printf("%c", s[i]);
}
printf("n");
}
return 0;
}
122-Triangular Sums
解法:count计数第几次
W(n) = SUM[k = 1…n; k * T(k + 1)]即W(n)=1*T(2)+2*T(3)+...+n*T(n+1)
T(n) = 1 + … + n ,等差数列求和也就是 T(n)=n*(n+1)/2
#include<stdio.h>
int main() {
int n, count = 1;
scanf("%d", &n);
while(n--) {
int a, sum = 0;
scanf("%d", &a);
for(int i = 1; i <= a; i++)
sum += i * (i + 1) * (i + 2) / 2;//W(n)
printf("%d %d %dn", count++, a, sum);
}
return 0;
}
124-中位数
#include<stdio.h>
#include<algorithm>
using namespace std;
int main() {
int t;
scanf("%d", &t);
while(t--) {
int m, a[1005];
scanf("%d", &m);
for(int i = 0; i < m; i++)
scanf("%d", &a[i]);
sort(a, a + m);
printf("%dn", a[(m - 1) / 2]);
}
return 0;
}
125-盗梦空间
#include<stdio.h>
int zhuanhua(int s, int r) {//转化为现实世界中的时间
s = s * 60;//先转换为秒,防止下面除20时要为整型舍去了一部分时间
for(int i = 1; i <= r; i++)
s /= 20;
return s;
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int m, r = 0, s;//r为梦境的层数
char c[5];
long long sum = 0;
scanf("%d", &m);
for(int i = 0; i < m; i++) {
scanf("%s", c);
if(c[0] == 'I') r++;
if(c[0] == 'O') r--;
if(c[0] == 'S') {
scanf("%d", &s);
sum += zhuanhua(s, r);
}
}
printf("%lldn", sum);
}
return 0;
}
127-星际之门(一)
解法:在一个n阶完全图的所有生成树的数量为n的n-2次方(图论)。
#include<stdio.h>
int f(int a, int b, int c) {
int sum = 1;
for(int i = 1; i <= b; i++) {
sum *= a;
sum %= c;
}
return sum;
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int n;
scanf("%d", &n);
printf("%dn", f(n, n-2, 10003));
}
return 0;
}
139-我排第几个
#include<stdio.h>
const int a[] = {39916800, 3628800, 362880, 40320, 5040, 720, 120, 24, 6, 2, 1, 1};
//11到0分别的阶乘
int cator(char *s, int n) {
int sum = 0, t;
for(int i = 0; i < n; i++) {
t = 0;
for(int j = i + 1; j < n; j++) {
if(s[j] < s[i]) t++;//找出比其小的并且还没有出现过的个数
}
sum += a[i] * t;
}
return sum + 1;//上述所求数是比目标值小的种数目,所以加一
}
int main() {
int n;
scanf("%d", &n);
while(n--) {
char s[13];//数组必须开大一点
scanf("%s", s);
printf("%dn", cator(s, 12));
}
return 0;
}
144-小珂的苦恼
#include<stdio.h>
int gcd(int a, int b) {
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
int main() {
int N;
scanf("%d", &N);
while(N--) {
int a, b, n;
scanf("%d%d%d", &a, &b, &n);
if(n % gcd(a, b) == 0) printf("Yesn");//s = gcd(a, b) n%s shi赋值
else
printf("Non");
}
return 0;
}
154-king 选 太子
#include<stdio.h>
#include<algorithm>
using namespace std;
int main() {
int t;
scanf("%d", &t);
while(t--) {
int n, a[1005];
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a + n);
if(n % 2 != 0) printf("%dn", a[(n - 1) / 2]);
else {
if(a[n / 2] > a[n / 2 - 1]) printf("%dn", a[n / 2]);
else
printf("%dn", a[n / 2 - 1]);
}
}
return 0;
}
156-Hangover
#include<stdio.h>
int main() {
double n;
while(scanf("%lf", &n), n) {
double count = 0, sum = 0, i = 1.00;
while(sum < n) {
i++;
sum += 1.00 / i;
count++;
}
printf("%d card(s)n", (int)count);
}
return 0;
}
157-487-3279
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
int main() {
char seq[100];//列好对应关系准备转换成数字
seq['A'] = seq['B'] = seq['C'] = '2';
seq['D'] = seq['E'] = seq['F'] = '3';
seq['G'] = seq['H'] = seq['I'] = '4';
seq['J'] = seq['K'] = seq['L'] = '5';
seq['M'] = seq['N'] = seq['O'] = '6';
seq['P'] = seq['R'] = seq['S'] = '7';
seq['T'] = seq['U'] = seq['V'] = '8';
seq['W'] = seq['X'] = seq['Y'] = '9';
int n;
while(cin >> n) {
char str[100], temp[10];//str用来存储输入数据,temp用来暂存输出数据
map<string, int> p;
for(int i = 0; i < n; i++) {
cin >> str;
int k = 0;//因为'-'的缘故,temp数组下标可能会与str数组下标不同步,同时重置temp数组
for(int j = 0; str[j] != '