前
感觉涉及到的知识点比较好吧,但是呢……有些题有点……
但还是个人知识有点遗忘了,码力不够了,读题还不太仔细吧
中
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还得调……
就这样