admin管理员组文章数量:1621657
B1046.划拳 7Min
签到题
/*B1046*/
#include <iostream>
using namespace std;
int main()
{
int N;
cin >> N;
int Awin = 0, Bwin = 0;
for (int i = 0; i < N; i++)
{
int AGuess, A, BGuess, B;
cin >> AGuess >> A >> BGuess >> B;
int sum = AGuess + BGuess;
if (A == sum && B != sum) Awin++;
if (B == sum && A != sum) Bwin++;
}
cout << Bwin << " " << Awin;
return 0;
}
B1047.编程团体赛 9min
签到题
/*B1047*/
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <stdio.h>
using namespace std;
int main()
{
int N;
cin >> N;
int TeamScore[1001] = {
0};
for (int i = 0; i < N; i++)
{
int Tid, Pid, score;
scanf("%d-%d %d", &Tid, &Pid,&score);
TeamScore[Tid] += score;
}
int maxS = 0, maxID;
for (int i = 1; i < 1001; i++)
{
if (TeamScore[i] > maxS)
{
maxS = TeamScore[i];
maxID = i;
}
}
printf("%d %d", maxID, maxS);
return 0;
}
B1048.数字加密 51min
自己做了非常久,主要是被不知道A长还是B长卡住了。柳神使用了补位的方法非常好,我觉得比判断size是否大于0要好理解而且不容易出错。
出现了几个用法:
1.reverse(A.begin(),B.end()); 翻转数组
2.str.append(你要补多少个,‘你要补啥字符’);用于str的末尾补全。
3.str[xxx] = {“asdansjdnsa”} 用于方便的转化int和char。非常机智
4.再次强调string的方便之处,可以直接 str += 某些字符或字符串。要学会用这个性质。
/*B1048*/
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <stdio.h>
using namespace std;
int main()
{
string A, B,c;
cin >> A >> B;
string tmp;
int Asize = A.length(), Bsize = B.length();
reverse(A.begin(), A.end());
reverse(B.begin(), B.end());//翻转
if (Asize > Bsize)
B.append(Asize - Bsize, '0');
else
A.append(Bsize - Asize, '0');//短的那个string补0
char str[14] = {
"0123456789JQK" };
for (int i = 0; i < B.size(); i++)
{
if (i % 2 == 0)
c += str[((A[i] - '0') + (B[i] - '0')) % 13];
else
{
if (B[i] - A[i] < 0)
c += str[(B[i] - '0') - (A[i] - '0') + 10];
else
c += str[(B[i] - '0') - (A[i] - '0')];
}
}
for (int i = c.length() - 1; i >= 0; i--)
cout << c[i];
return 0;
}
1049.数列的片段和 fail
没做出来。
解法:假设我们选取的片段包括某个数字n,然后该片段的头指针有i种选择,片段的尾指针有(N-1-i)种选择,这样这个指针组合就是 i * (N-1-i)种。但实际上不知道为啥后面变成了 n xi x(N-i+1)。
/*B1049*/
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <stdio.h>
using namespace std;
int main()
{
int N;
cin >> N;
double sum = 0.0, n;
for (int i = 0; i < N; i++)
{
cin >> n;
sum += n*i*(N - i + 1);
}
printf("%.2lf",sum);
return 0;
}
B1050.螺旋矩阵 fail
第一次做: 打印没想出办法,只计算出了mn。
第二次做:高度参考了柳神的方法。 每个口字型做一个level,用i(当前level层数)以及j(每一笔必定只有一个变量,要么是行,要么是列,J就表示这个变化的东西),来表示出矩阵的每一个位置。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <math.h>
using namespace std;
bool cmp(int a ,int b)
{
return a > b ? true : false;
}
int main()
{
int N,m,n;
cin >> N;
for (n = sqrt(N); n > 0; n--)
{
if (N % n == 0)
break;
}
m = N / n;
vector<int> ori(N);
for (int i = 0; i < N; i++)
{
cin>>ori[i];
}
sort(ori.begin(), ori.end(), cmp);
vector<vector<int> > b(m, vector<int>(n));//创建矩阵
int level = m / 2 + m % 2;
int t = 0;
//填入原理:i是当前层数,j是变化的一笔,这一笔可以是行也可以是列。
//i,j,m,n来表示矩阵的每一个位置。只要细心是不会出错的。
for (int i = 0; i < level; i++)//外层循环控制层数
{
for (int j = i; j <= n - 1 - i && t <= N - 1; j++)
b[i][j] = ori[t++];
for (int j = i + 1; j <= m - 2 - i && t <= N - 1; j++)
b[j][n -1-i] = ori[t++];
for (int j = n - 1 - i; j >= i && t <= N - 1; j--)
b[m - 1 - i][j] = ori[t++];
for (int j = m - 2 - i; j >= i + 1 && t <= N; j--)
b[j][i] = ori[t++];
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if(j != n-1)
cout << b[i][j]<<" ";
else
cout << b[i][j] << "\n";
}
}
return 0;
}
B1051.复数乘法 12min
有两个点没过,看题解是说A和B如果大于-0.005但小于0时,会出错。本来应该输出0.00,但输出了-0.00.等于说要排除这个特殊情况。但自己做的时候没发现。(我也不知道咋发现)
记得cos,sin在math.h里面。
/*B1051*/
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <stdio.h>
#include &
版权声明:本文标题:【PTA刷题】乙级 1046 To 1065 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728850400a1176603.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论