[解题报告]训练日记1

题目链接

感觉涉及到的知识点比较好吧,但是呢……有些题有点……

但还是个人知识有点遗忘了,码力不够了,读题还不太仔细吧

Let the Balloon Rise

emmm,用其他做法存储可能会有点麻烦吧,典型的可以用map来做啊

不过有点忘记了,留着补坑

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;

string x[1005];
map<string , int> p;
int n , maxx , flag;

int main() {
    
    
	while (1) {
    
    
		scanf("%d", &n);
		if (n == 0)
			break;
        p.clear();
        memset(x , 0 , sizeof(0));
		for (int i = 1; i <= n; i++) {
    
    
			cin >> x[i];
			p[x[i]]++;
		}
        maxx = p[x[1]]; flag = 1;
		for (int i = 2; i <= n; i++) {
    
    
			if (p[x[i]] > maxx) {
    
    
				maxx = p[x[i]];
				flag = i;
			}
		}
		cout << x[flag] << endl;
	}
	return 0;
}

Number Sequence

我们管他叫:类斐波那契数列吧

把斐波那契数列的矩阵快速幂稍微拓展一下就可以发现A与B在矩阵中的位置(“稍微拓展一下”的前提:明白斐波那契数列的矩阵快速幂做法的原理)

#include<iostream>
#include<cstdio>
#define mod 7
using namespace std;

struct Ju1 {
    
    
	int x, y;
};
struct Ju2 {
    
    
	int x1, x2, x3, x4;
};
Ju1 pre;
Ju2 op , dw;
int A, B, n;

void init() {
    
    
	pre.x = 1;
	pre.y = 1;
	op.x1 = A;
	op.x2 = 1;
	op.x3 = B;
	op.x4 = 0;
	dw.x1 = dw.x4 = 1;
	dw.x2 = dw.x3 = 0;
}

Ju1 mul1(Ju1 x, Ju2 y) {
    
    
	Ju1 t;
	t.x = (x.x * y.x1 % mod + x.y * y.x3 % mod ) % mod;
	t.y = (x.x * y.x2 % mod + x.y * y.x4 % mod) % mod;
	return t;
}

Ju2 mul2(Ju2 x, Ju2 y) {
    
    
	Ju2 t;
	t.x1 = (x.x1 * y.x1 % mod + x.x2 * y.x3 % mod) % mod;
	t.x2 = (x.x1 * y.x2 % mod + x.x2 * y.x4 % mod) % mod;
	t.x3 = (x.x3 * y.x1 % mod + x.x4 * y.x3 % mod) % mod;
	t.x4 = (x.x3 * y.x2 % mod + x.x4 * y.x4 % mod) % mod;
	return t;
}

Ju2 qpow(Ju2 x, int y) {
    
    
	if (y == 0)
		return dw;
	Ju2 t = qpow(x, y / 2);
	if (y % 2 == 0)
		return mul2(t, t);
	return mul2(mul2(t, t), op);
}

int fib(int x) {
    
    
	if (x == 1)
		return 1;
	Ju1 t = mul1(pre, qpow(op, x - 2));
	return t.x % mod;
}

int main() {
    
    
	while (scanf("%d%d%d", &A, &B, &n) != EOF) {
    
    
		if (A == 0 && B == 0 && n == 0)
			break;
		init();
		printf("%d\n", fib(n)%mod);
	}
	return 0;
}

Elevator

啊这 水题没一遍AC 因为……

电梯:我到我自己?

#include<iostream>
#include<set>
#include<cstdio>
using namespace std;

int n , pos , tim;

int main() {
    
    
	while(1) {
    
    
		pos = 0;
		tim = 0;
		scanf("%d",&n);
		if(n==0)
			break;
		for(int i=1; i<=n; i++) {
    
    
			int x;
			scanf("%d",&x);
			if(x>=pos)
				tim = tim + (x-pos)*6+5;
			if(x<pos)
				tim = tim + (pos-x)*4+5;
			pos = x;
		}
		printf("%d\n",tim);
	} 
    return 0;
}

u Calculate e

很水的模拟题吧 稍微注意的就是前几行单独输出吧

#include<iostream>
#include<set>
#include<cstdio>
using namespace std;

double ans = 2.5;
int n = 2; 

int main() {
    
    
	printf("n e\n");
	printf("- -----------\n");
	printf("0 1\n");
	printf("1 2\n");
    printf("2 2.5\n");
	for(int i=3; i<=9; i++) {
    
    
		n = n*i;
		ans = ans + 1.0/n;
		printf("%d %.9f\n",i,ans);
	}
    return 0;
}

Digital Roots

这题比较坑的地方就是没告诉n的大小

所以最好要用字符串/字符数组输入

知道这个就能一遍A了?

其实并不能:cin输入字符串要用string头文件

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

int len , ans , x;
string n;

int sol(int m) {
    
    
	x = 0;
	while(m) {
    
    
		x = x + m%10;
		m = m/10; 
	}
	return x;
}

int main() {
    
    
	while(1) {
    
    
		cin>>n;
		if(n[0]=='0')
			break;
		ans = 0;
		len = n.length();
		for(int i=0; i<len; i++)
			ans = ans + (n[i]-'0');
		if(ans<10)
			printf("%d\n",ans);
		else {
    
    
			while(sol(ans)>=10)
				ans = x;
			printf("%d\n",x);
		}
	}
	return 0;
} 

Uniform Generator

就是一个模拟题 坑点在于输出格式

(输出两个空行!!!)

#include<iostream>
#include<set>
#include<cstdio>
#include<cstring>
using namespace std;

int step, mod, num[100005], cnt[100005], flag;

int main() {
    
    
	while (scanf("%d%d", &step, &mod) != EOF) {
    
    
		num[0] = 0;
		flag = 0;
		memset(cnt, 0, sizeof(cnt));
		memset(num, 0, sizeof(num));
		for (int i = 1; i <= 100000; i++) {
    
    
			num[i] = (num[i - 1] + step) % mod;
			cnt[num[i]]++;
			if (cnt[num[i]] == 2)
				break;
		}
		for (int i = 1; i < mod; i++)
			if (cnt[i] == 0) {
    
    
				flag = 1;
				printf("%10d%10d    Bad Choice\n\n", step, mod);
				break;
			}
		if (flag == 0)
			printf("%10d%10d    Good Choice\n\n", step, mod);
	}
	return 0;
}

Safecracker

简单dfs+回溯

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;

int n , len , num[15] , vis[15] , top , flag;
char ans[15];
string s;

bool cmp(int a, int b) {
    
    
	return a > b;
}

void dfs(int deep, int sum) {
    
    
	if(flag)
		return ;
	if (deep == 5) {
    
    
		if (sum == n) {
    
    
			for (int i = 1; i <= 5; i++)
				cout << ans[i];
			cout << endl;
			flag = 1;
			return ;
		}
		return;
	}
	for (int i = 1; i <= len; i++) {
    
    
		if (vis[i] == 1)
			continue;
		vis[i] = 1;
		top++;
		ans[top] = num[i] - 1 + 'A';
		int xx = pow(num[i] , deep+1) , yy = pow(-1 , deep+2);
		dfs(deep + 1, sum + xx * yy);
		vis[i] = 0;
		top--;
	}
}

int main() {
    
    
	while (1) {
    
    
		cin >> n >> s;
		if (n == 0 && s == "END")
			break;
		top = 0; flag = 0;
		memset(ans, 0, sizeof(ans));
		memset(vis, 0, sizeof(vis));
		len = s.length();
		for (int i = 0; i < len; i++)
			num[i + 1] = s[i] - 'A' + 1;
		sort(num + 1, num + len + 1 , cmp);
		dfs(0, 0);
		if(!flag)
			printf("no solution\n");
	}
	return 0;
}

总结来说吧 题目难度不高 都是偏简单的题吧

但是我感觉被罚时的原因呢 是不熟悉这个OJ和读题不认真吧

还有不足的地方在于 做题时间比较长吧 简单dfs还得调……

就这样

猜你喜欢

转载自blog.csdn.net/cls1277/article/details/109497046
今日推荐