|
|
题目20 [HAOI 2005]破译密文
7
评论
2022-11-07 23:35:17
|
|
|
Pro37 高精度加法 题解#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[250],b[250],c[500];
int len;
int main(){
freopen("add.in","r",stdin);
freopen("add.out","w",stdout);
cin >> s1 >> s2;
for (int i = 0; i < s1.size(); i++) {
a[s1.size() - i - 1] = s1[i] - '0';
}
for (int i = 0; i < s2.size(); i++) {
b[s2.size() - i - 1] = s2[i] - '0';
}
len = s1.size();
if (s1.size() < s2.size()) {
len = s2.size();
}
for (int i = 0; i < len; i++) {
c[i] = a[i] + b[i];
}
for (int i = 0; i < len; i++) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
if (c[len] != 0) {
len++;
}
for (int i = len - 1; i >= 0; i--) {
cout << c[i];
}
}
//第一步:定义 //第二步:输入 //第三步:将字符串转换成数组 //第四步:相加(中间有进位,详见代码) //第四步:输出
题目37 高精度加法
AAAAAAAAAA
3
评论
2022-11-07 10:01:57
|
|
|
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
struct q {
int a;
char b[200];
q()
{
a = 0;
}
bool operator < (const q &A)const
{
return a < A.a;
}
} Q[51];
int n;
int main()
{
freopen("nba.in", "r", stdin);
freopen("nba.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%[^0-9]%d", &Q[i].b, &Q[i].a);
Q[i].b[0] = ' ';
}
sort(Q + 1, Q + n + 1);
for (int i = 1; i <= n; i++)if (Q[i].a != Q[i + 1].a) {
cout << Q[i].a << ' ' << Q[i].b << endl;
}
return 0;
}
//这道题用结构体就行 //第一步:定义结构体 //第二步:输入加排序(详细的见程序) //第三步:输出
题目482 NBA总冠军
AAAAAAAAAA
3
评论
2022-11-07 09:57:20
|
|
|
Pro38 高精度减法 题解#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[250],b[250],c[250];
char f = '+';
int len,p;
int main(){
freopen("sub.in","r",stdin);
freopen("sub.out","w",stdout);
cin >> s1 >> s2;
if (s2.size() > s1.size() || (s1.size() == s2.size() && s2 > s1)) {
swap(s1,s2);
f = '-';
}
for (int i = 0; i < s1.size(); i++) {
a[s1.size() - i - 1] = s1[i] - '0';
}
for (int i = 0; i < s2.size(); i++) {
b[s2.size() - i - 1] = s2[i] - '0';
}
len = s1.size();
for (int i = 0; i < len; i++) {
if (a[i] < b[i]) {
a[i + 1] -= 1;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
if (f == '-') cout << f;
for (int i = len - 1; i >= 0; i--) {
if (c[i] != 0) {
p = i;
break;
}
}
for (int i = p; i >= 0; i--) cout << c[i];
}
这道题用三个数组就行。 第一步:把输入的字符串转换成数组(因为都是数字) 第二步:相减,不够就借位 第三步:判断是否是负数 第四步:输出
题目38 高精度减法
AAAAAAAAAA
3
评论
2022-11-07 09:52:51
|
|
|
Pro3790 界外科学 题解本题三种做法。 第一种:直接跑一遍dfs求最大值,期望得分50分。 第二种:折半搜索,map统计去重,最后求最大值。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m, half, a[50], b[50], num1[1 << 21], num2[1 << 21], cnt1, cnt2, ans;
map<int, int> mp, mp2;
int dfs2(int x, int s, int p) {
if(x == n + 1) {
if(!mp2[p]) {
num2[++ cnt2] = p;
}
if(s > mp2[p]) {
mp2[p] = s;
}
return 0;
}
dfs2(x + 1, s, p);
dfs2(x + 1, s + b[x], p ^ a[x]);
}
int dfs(int x, int s, int p) {
if(x == half + 1) {
if(!mp[p]) {
num1[++ cnt1] = p;
}
if(s > mp[p]) {
mp[p] = s;
}
return 0;
}
dfs(x + 1, s, p);
dfs(x + 1, s + b[x], p ^ a[x]);
return 0;
}
signed main() {
freopen("outsci.in", "r", stdin);
freopen("outsci.out", "w", stdout);
cin >> n >> m;
half = n / 2;
for(int i = 1; i <= n; i ++) {
cin >> a[i];
}
for(int i = 1; i <= n; i ++) {
cin >> b[i];
}
dfs(1, 0, 0);
// for(int i = 1; i <= cnt; i ++) {
// cout << c[i] << ' ' << mp[c[i]] << endl;
// }
dfs2(half + 1, 0, 0);
for(int i = 1; i <= cnt1; i ++) {
for(int j = 1; j <= cnt2; j ++) {
if((num1[i] ^ num2[j]) <= m) {
ans = max(ans, mp[num1[i]] + mp2[num2[j]]);
}
}
}
cout << ans << endl;
return 0;
}
第三种 正解(伪):所有大于零的b求和( 这数据是拿脚捏的吗?这都能水过??? 真正的正解还没想到QAQ
题目3790 界外科学
WWWWWWWWWWWW
10
评论
2022-11-06 21:22:10
|
|
|
当大家都在写线段树时,我在写分块( 这题求的是交替序列值,正常的是求区间和,那么我们如何转换区间和为交替序列值呢? 我们可以将序列分为两部分,下标为 $i$ 的数 $a_i$ 属于第 $i%2$ 个部分。那么我们就将序列拆为了两部分,其中用第 $0$ 部分序列和减去第 $1$ 部分的序列和即为交替序列值。 但是上面的情况只适用于 $l%2=1$ 的情况,另一种情况取个相反数就行了。
题目2951 [SYOI 2018] WHZ 的序列
AAAAAAAAAA
10
评论
2022-11-06 21:15:29
|