2022
L1-1:今天我要赢
题目链接
#include<iostream>
using namespace std;
int main()
{
cout<<"I'm gonna win! Today!"<<endl;
cout<<"2022-04-23"<<endl;
return 0;
}
L1-2:种钻石
题目链接
#include<iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n,v; cin>>n>>v;
cout<<n/v;
return 0;
}
L1-3:谁能进图书馆
题目链接
#include<iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int a,b,c,d; cin>>a>>b>>c>>d;
if(c<a&&d<a)
{
cout<<c<<"-N "<<d<<"-N"<<endl;
cout<<"zhang da zai lai ba"<<endl;
}
else if(c<a&&d>=b)
{
cout<<c<<"-Y "<<d<<"-Y"<<endl;
cout<<"qing 2 zhao gu hao 1"<<endl;
}
else if(d<a&&c>=b)
{
cout<<c<<"-Y "<<d<<"-Y"<<endl;
cout<<"qing 1 zhao gu hao 2"<<endl;
}
else if(c>=a&&d>=a)
{
cout<<c<<"-Y "<<d<<"-Y"<<endl;
cout<<"huan ying ru guan"<<endl;
}
else if(c>=a&&d<a)
{
cout<<c<<"-Y "<<d<<"-N"<<endl;
cout<<"1: huan ying ru guan"<<endl;
}
else if(c<a&&d>=a)
{
cout<<c<<"-N "<<d<<"-Y"<<endl;
cout<<"2: huan ying ru guan"<<endl;
}
return 0;
}
L1-4:拯救外星人
题目链接
#include<iostream>
using namespace std;
int main()
{
int a,b; scanf("%d%d",&a,&b);
int x=a+b;
int sum=1;
for(int i=1;i<=x;i++) sum=sum*i;
cout<<sum;
return 0;
}
L1-5:试试手气
题目链接
#include<iostream>
using namespace std;
bool f[10][10]={0};
int main()
{
int x,n,a[10];
for(int i=1;i<=6;i++)
{
scanf("%d",&x);
a[i]=x;
f[i][x]=1;
}
scanf("%d",&n);
while(n--)
{
for(int i=1;i<=6;i++)
{
for(int j=6;j>=1;j--)
{
if(!f[i][j])
{
a[i]=j;
f[i][j]=1; break;
}
}
}
}
for(int i=1;i<=6;i++)
{
printf("%d",a[i]);
if(i!=6) printf(" ");
}
printf("\n");
return 0;
}
L1-6:斯德哥尔摩火车上的题
题目链接
#include<iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
string s1="",s2="";
string a1,a2; cin>>a1>>a2;
int i;
for(i=1;i<a1.size();i++)
{
if (a1[i]%2==a1[i-1]%2)
{
s1+=max(a1[i],a1[i-1]);
}
}
for(i=1;i<a2.size();i++)
{
if (a2[i]%2==a2[i-1]%2)
{
s2+=max(a2[i],a2[i-1]);
}
}
if(s1==s2) cout<<s1;
else cout<<s1<<endl<<s2<<endl;
return 0;
}
L1-7:机工士姆斯塔迪奥
题目链接
#include<iostream>
using namespace std;
const int N=1e5+10;
bool f1[N];
bool f2[N];
int main()
{
int n,m,q; scanf("%d%d%d",&n,&m,&q);
long long rex=0;
long long S=m*n;
int a=0,b=0;
while(q--)
{
int t,x; scanf("%d%d",&t,&x);
if(t==0)
{
if(!f1[x])
{
rex+=m; f1[x]=1; a++;
}
}
if(t==1)
{
if(!f2[x])
{
rex+=n; f2[x]=1; b++;
}
}
}
rex=rex-a*b;
cout<<S-rex;
return 0;
}
L1-8:静静的推荐
题目链接
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct stu {int t,p;};
vector<stu> v;
bool f[N]={0};
bool cheak(bool f[])
{
for(int i=0;i<v.size();i++)
{
if(!f[i]) return false;
}
return true;
}
bool cmp(stu s1,stu s2)
{
if(s1.t<s2.t) return true;
else if(s1.t==s2.t&&s1.p<s2.p) return true;
else return false;
}
int main()
{
int n,k,s; scanf("%d%d%d",&n,&k,&s);
for(int i=0;i<n;i++)
{
stu a; scanf("%d%d",&a.t,&a.p);
if(a.t>=175) v.push_back(a);
}
sort(v.begin(),v.end(),cmp);
int cnt=0;
while((k--)&&!cheak(f))
{
int ans=0;
for(int i=0;i<v.size();i++)
{
if(f[i]) continue;
if(v[i].t>ans)
{
cnt++; ans=v[i].t; f[i]=1;
continue;
}
else if(v[i].t==ans&&v[i].p>=s)
{
cnt++; ans=v[i].t; f[i]=1;
}
}
}
printf("%d",cnt);
return 0;
}
L2-1:插松枝
题目链接
#include<bits/stdc++.h>
using namespace std;
void printf(vector<int> &v)
{
for(int i=0;i<v.size();i++)
{
cout<<v[i];
if(i!=v.size()-1) cout<<" ";
}
cout<<endl;
while(v.size()) v.pop_back();
}
int main()
{
vector<int> v;//松树
queue<int> q; //推送器
stack<int> s; //盒子
int n,m,k; cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
int x; cin>>x;
q.push(x);
}
while(q.size()||s.size())
{
int cnt=0,last=101;
//松针个数 最后插入的松针大小
while(cnt<k)
{
//如果小盒子中最上面的松针满足要求,就取之插好
if(s.size()&&s.top()<=last)
{
v.push_back(s.top());
last=s.top(); s.pop(); cnt++;
}
//否则去推送器上取
else if(q.size())
{
int t=q.front();
//如果推送器上拿到的满足要求,就插到树上
if(t<=last)
{
v.push_back(t);
last=t; q.pop(); cnt++;
}
//如果推送器上拿到的仍然不满足要求,就把拿到的这片堆放到小盒子里
else if(s.size()<m)
{
s.push(t); q.pop();
}
else break;
}
else break;
}
printf(v);
}
return 0;
}
L2-2:老板的作息表
题目链接
#include<iostream>
using namespace std;
const int N=86400;
bool Time[N+10]={0};
int main()
{
int n; cin>>n;
while(n--)
{
int a1,b1,c1,a2,b2,c2;
scanf("%d:%d:%d - %d:%d:%d",&a1,&b1,&c1,&a2,&b2,&c2);
for(int i=a1*3600+b1*60+c1;i<a2*3600+b2*60+c2;i++) Time[i]=1;
}
for(int i=0;i<N-1;i++)
{
if(!Time[i])
{
int x,y,z; x=i/3600; z=i%60; y=(i-(x*3600+z))/60;
printf("%02d:%02d:%02d - ",x,y,z);
while(!Time[i])
{
if(i==N) {i--; break;}
i++;
}
int x1,y1,z1; x1=i/3600; z1=i%60; y1=(i-(x1*3600+z1))/60;
printf("%02d:%02d:%02d\n",x1,y1,z1);
}
}
return 0;
}
L2-3:龙龙送外卖
题目链接
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int p[N]; //父节点
int d[N]; //到根节点的距离
int n,m;
int mx;//mx:最远送饭点的距离
int sum;//sum:所有途径节点的总距离和
int dfs(int x)
{
if(p[x]==-1) return 0;//根节点 距离为0
if(d[x]!=0) return d[x];//已经计算过的节点 返回即可
sum++;//新节点 距离增加
d[x]=dfs(p[x])+1;//距离等于父节点距离+1
return d[x];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&p[i]);
while(m--)
{
int x; scanf("%d",&x);//新增x点要送饭
mx=max(mx,dfs(x));
printf("%d\n",sum*2-mx);//画图可知 由于到最后一个点之后不返回 所以要减去mx
}
return 0;
}
L2-4:大众情人
题目链接
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=520;
const int INF=0x3f3f3f3f;//最大值
char sex[N];//性别
int d[N][N];//d[i][j]:i到j的最短距离
int m1[N],m2[N];
//m1[i]:编号为 i 的男人 在男性眼里的最大距离
//m2[i]:编号为 i 的女人 在女性眼里的最大距离
int main()
{
memset(d,0x3f,sizeof d);//初始化d数组
int n; scanf("%d",&n);
for(int i=1;i<=n;i++)
{
char ch[2]; int k;
scanf("%s%d",ch,&k);
sex[i]=ch[0];
while(k--)
{
int x,y;
scanf("%d:%d",&x,&y);
d[i][x]=y;//i到x的距离为y
}
}
//Floyd算法
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
//mi1:所有女性的最大距离的 最小距离
//mi2:所有男性的最大距离的 最小距离
int mi1=INF,mi2=INF;
for(int i=1;i<=n;i++)
{
if(sex[i]=='F')
{
int ma=0;
for(int j=1;j<=n;j++)
{
if(sex[j]=='M')
{//注意这里是在异性看来的距离 也就是d[j][i]
ma=max(ma,d[j][i]);
}
}
mi1=min(mi1,ma);
m1[i]=ma;
}
if(sex[i]=='M')
{
int ma=-1;
for(int j=1;j<=n;j++)
{
if(sex[j]=='F')
{
ma=max(ma,d[j][i]);
}
}
mi2=min(mi2,ma);
m2[i]=ma;
}
}
//把是答案的人的编号提到相应的数组中
int p1[N],p2[N];//答案数组
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++)
{
if(sex[i]=='F'&&m1[i]==mi1) p1[cnt1++]=i;
if(sex[i]=='M'&&m2[i]==mi2) p2[cnt2++]=i;
}
for(int i=0;i<cnt1;i++)
{
printf("%d",p1[i]);
if(i!=cnt1-1) printf(" ");
}
printf("\n");
for(int i=0;i<cnt2;i++)
{
printf("%d",p2[i]);
if(i!=cnt2-1) printf(" ");
}
return 0;
}
L3-1:千手观音
题目链接
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <queue>
using namespace std;
const int N=1e4+10;
int n;
unordered_map<string,int> d;//每个点的入度
unordered_map<string,vector<string>> g;//邻接表
vector<string> get(string str)
{//将每个单词都从str里面分出来
vector<string> rex;
string word;
for(auto c:str)
{
if(c=='.')
{//是 '.' 就分隔一次
rex.push_back(word);
if(d.count(word)==0) d[word]=0;//如果入度表里首次出现就存一下
word="";
}
else word+=c;
}
rex.push_back(word);//将最后一个单词也存入
if(d.count(word)==0) d[word]=0;
return rex;
}
vector<string> topsort()
{//拓扑排序
priority_queue<string,vector<string>,greater<string>> heap;//优先队列
for(auto& [k,v]:d)
{
if(!v)
{//如果入度为0就入队
heap.push(k);
}
}
vector<string> rex;
while(heap.size())
{
//每次都取出队头,做答案
auto t=heap.top();
heap.pop();
rex.push_back(t);
for(auto &u:g[t])
{//入度为0,入队
if(--d[u]==0)
{
heap.push(u);
}
}
}
return rex;
}
int main()
{
scanf("%d\n",&n);
char str[50];
scanf("%s",str);
auto last=get(str);
for(int i=0;i<n-1;i++)
{
scanf("%s",str);
auto cur=get(str);
if(last.size() == cur.size())
{
for(int j=0;j<cur.size();j++)
{
if(last[j]!=cur[j])
{
//连接一条last->cur的边
g[last[j]].push_back(cur[j]);
d[cur[j]]++;
break;
}
}
}
last=cur;//更新last
}
auto rex=topsort();
printf("%s",rex[0].c_str());
for(int i=1;i<rex.size();i++)
printf(".%s",rex[i].c_str());
return 0;
}