20240505
A-第几秒
#include<bits/stdc++.h>
using namespace std;
int main()
{
int shi, fen ,miao; // 时,分,秒
char C;
cin >> shi >> fen >> miao >> C;//读入时,分,秒以及一个大写字母
if (C == 'P')
shi = shi + 12; // 转成24小时制
cout << shi * 60 * 60 + fen * 60 + miao;
return 0;
}
B-序列
#include<bits/stdc++.h>
using namespace std;
int n,a[1001];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);//排序
for(int i=1;i<=n/2;i++)
{
cout<<a[n-i+1]<<endl<<a[i]<<endl;//输出
}
if(n%2)cout<<a[n/2+1]<<endl;//特殊判断奇数
}
C-红绿灯
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int dist[N],r[N],g[N],t[N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++) scanf("%d",&dist[i]);
for(int i=1;i<=n;i++) scanf("%d",&r[i]);
for(int i=1;i<=n;i++) scanf("%d",&g[i]);
for(int i=1;i<=n;i++)
{
//当i==1时,m实际上就是到达1号路口的时间
//当i!=1时,当前的时间加上开车的距离,就是到达i号路口的时间
if(i!=1) m+=dist[i-1];
int t=r[i]+g[i]; //路灯循环一次的时间
int mod=m%t; // 当前时间%循环一次的时间,求出当前是该路口绿灯亮起后的第mod秒
if(g[i]<mod) //如果绿灯亮的时间<mod,证明现在是红灯,还需要等到绿灯亮,则还要等t-mod秒
m+=t-mod;
printf("%d\n",m); //真正通过路口的时间
}
return 0;
}
D-彩票摇奖
#include<cstdio>
#include<algorithm>
using namespace std;
int n,sum;
int a[50],b[8];
//a[i]==1表示这i这个数字是中奖号码
int main()
{
scanf("%d",&n);
for(int i=1;i<=7;i++)
{
int t;
scanf("%d",&t);
a[t]++;
}
for(int i=1;i<=n;i++)
{
int t,x=7;
//x表示有多少个号码没中奖,最终x为几就表明中了几等奖,0为特等奖,7为没有奖
for(int j=1;j<=7;j++)
{
scanf("%d",&t);
if(a[t]) x--;//如果t这个号码是中奖号码,x--
}
b[x]++;
}
for(int i=0;i<=6;i++) printf("%d ",b[i]);
return 0;
}
E-Cantor 表
多种方法可做,这里用找规律的方式讲解。
斜着看这个表,可以把它看做一个三角:
1/1(第一行)
1/2 2/1(第二行)
3/1 2/2 1/3(第三行)
1/4 2/3 3/2 4/1(第四行)
设i为行号,可以发现奇数行第一个数是i/1,后面分子递减,分母递增;偶数行第一个数是1/i,分母递减,分子递增。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int N,h=1;
cin>>N;
while(N>h) //用循环来算出行数
{
N-=h;
h++;
}
//此时N表示这个数是第h行第N列
int x,y;//分子、分母
if(h%2==0)//判断行数是奇数还是偶数
{
x=N;
y=h-N+1;
}
// 奇数:分子减N-1,分母加N-1;偶数反之
else
{
x=h-N+1;
y=N;
}
cout<<x<<"/"<<y;
return 0;
}