制作不易,大家的点赞和关注就是我更新的动力!
由于这些题全是大一寒假刷的,部分还是c语言,部分的解题方法比较复杂,希望大家体谅。有问题欢迎大家在评论区讨论,有不足也请大家指出,谢谢大家!
温馨提示:可以点目录跳转到相应题目哦。
1046 划拳
分数 15
作者 CHEN, Yue
单位 浙江大学
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。
输入格式:
输入第一行先给出一个正整数 N(≤100),随后 N 行,每行给出一轮划拳的记录,格式为:
甲喊 甲划 乙喊 乙划
其中喊
是喊出的数字,划
是划出的数字,均为不超过 100 的正整数(两只手一起划)。
输出格式:
在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。
输入样例:
5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
输出样例:
1 2
代码:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
int n,jia=0,yi=0,i,j;
cin>>n;
int jhan,jhua,yhan,yhua;
for(i=0;i<n;i++)
{
int jj,yy;
cin>>jhan>>jhua>>yhan>>yhua;
jj=jhan+jhua;yy=yhan+yhua;
if(jhua==jhan+yhan&&yhua!=jhan+yhan)
{
yi++;
}
else if(yhua==jhan+yhan&&jhua!=jhan+yhan){
jia++;
}
}
cout<<jia<<" "<<yi;
return 0;
}
1047 编程团体赛
分数 20
作者 CHEN, Yue
单位 浙江大学
编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。
现给定所有队员的比赛成绩,请你编写程序找出冠军队。
输入格式:
输入第一行给出一个正整数 N(≤104),即所有参赛队员总数。随后 N 行,每行给出一位队员的成绩,格式为:队伍编号-队员编号 成绩
,其中队伍编号
为 1 到 1000 的正整数,队员编号
为 1 到 10 的正整数,成绩
为 0 到 100 的整数。
输出格式:
在一行中输出冠军队的编号和总成绩,其间以一个空格分隔。注意:题目保证冠军队是唯一的。
输入样例:
6
3-10 99
11-5 87
102-1 0
102-3 100
11-9 89
3-2 61
输出样例:
11 176
代码:
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
struct st
{
int dw,id,sc;
};
int main()
{
int n,i,j,a[10000]={0};
cin>>n;
st s[n+2];
for(i=0;i<n;i++)
{
scanf("%d-%d %d",&s[i].dw ,&s[i].id ,&s[i].sc );
a[s[i].dw ]+=s[i].sc ;
}
int max=0,t;
for(i=0;i<1001;i++)
{
if(a[i]>max)
{
max=a[i];t=i;
}
}
cout<<t<<" "<<max;
return 0;
}
1048 数字加密
分数 20
作者 CHEN, Yue
单位 浙江大学
本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:
输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:
在一行中输出加密后的结果。
输入样例:
1234567 368782971
输出样例:
3695Q8118
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string p, q;
int a[200];
cin >> p>> q;
reverse(p.begin(), p.end());
reverse(q.begin(), q.end());
if (p.size() > q.size())
q.append(p.size() - q.size(), '0');
else if(p.size() < q.size())
p.append(q.size() - p.size(), '0');
int A, B;
for (int i = 0; i < p.length(); i++)
{
A = p[i] - '0';
B = q[i] - '0';
if (i % 2 == 0)
{
a[i] = (A + B) % 13;
}
else
{
a[i] = (B - A + 10) % 10;
}
}
for (int i = p.length() - 1; i >= 0; i--)
{
if (a[i] == 10)
cout << "J";
else if (a[i] == 11)
cout << "Q";
else if (a[i] == 12)
cout << "K";
else
cout << a[i];
}
}
1049 数列的片段和
分数 20
作者 CAO, Peng
单位 Google
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这 10 个片段。
给定正整数数列,求出全部片段包含的所有的数之和。如本例中 10 个片段总和是 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。
输入格式:
输入第一行给出一个不超过 105 的正整数 N,表示数列中数的个数,第二行给出 N 个不超过 1.0 的正数,是数列中的数,其间以一个空格分隔。
输出格式:
在一行中输出该序列所有片段包含的数之和,精确到小数点后 2 位。
输入样例:
4
0.1 0.2 0.3 0.4
输出样例:
5.00
感谢 Ruihan Zheng 对测试数据的修正。
代码:
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
long long int n,i,j;
vector<double>v;
long double sum=0,a;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a;
v.push_back(a);
sum+=a*(n-i+1)*i;
}
printf("%.2llf",sum);
return 0;
}
1050 螺旋矩阵
分数 25
作者 CHEN, Yue
单位 浙江大学
本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。
输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。
输入样例:
12
37 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 93
42 37 81
53 20 76
58 60 76
代码:
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
int N,i,j;
cin>>N;
int m,n,a[N+2];
for(i=sqrt(N);i>=1;i--)
{
for(j=sqrt(N);j<=N+10;j++){
if(i*j==N) {
m=i;n=j;goto end;
}
}
}end:{}
int c[n+2][m+2],b[n+2][m+2];
for(i=0;i<N;i++)
{
cin>>a[i];
}
sort(a,a+N,greater<int>());
int k=0;
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
c[i][j]=0;
}
}
i=0;j=0;
int x=0,y=0;
while(k<N){
while(y!=m &&c[x][y]==0){
c[x][y]=1;
b[x][y++]=a[k++];
} y--;x++;
while(x!=n &&c[x][y]==0){
c[x][y]=1;
b[x++][y]=a[k++];
}x--;y--;
while(y>=0 &&c[x][y]==0){
c[x][y]=1;
b[x][y--]=a[k++];
}y++;x--;
while(x>=0 &&c[x][y]==0){
c[x][y]=1;
b[x--][y]=a[k++];
}x++;y++;
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cout<<b[i][j];
if(j!=m-1) cout<<" ";
}cout<<endl;
}
//cout<<m<<endl; cout<<n;
return 0;
}