总结
虽然三场比赛都参加了,但是部分题目的补题效果还没有特别理想,因为一些题目相对现在的水平而言还是有点大的难度,内容可能没什么知识基础,当然一些接触过的题目类型补起来就比较好了,重新写的时候也可以一下子想出思路,这是补题带来的一些收获。目前还是只能过签到和签到plus的题目(苦笑),尤其是在牛客训练营的比赛的时候感到十分吃力尽管有思路和想法还是WA,由此可见还有很多需要进步的地方,还需要继续努力学习算法知识刷刷算法题。当然,相对于寒假训练前的水平也提高了不少,尤其是更进一步操练了常用的算法如拓扑排序、二分、dp、贪心等等算法,为这一周和春节假期间的加训带来的进步和付出的努力点个赞,再接再厉下一周。
2.5训练赛总结
签到题
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"All in!"<<endl;
}
题目大意:n,m,k表示一栋房子有m层楼,高为k,我住在第n层楼,问距离地面多远?
cout输出时WA了,printf输出就对了,奇奇怪怪
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
int t,m,k;
double q,w,e;
cin>>t>>m>>k;
q=k*1.0;
e=q/m;
w=(t-1)*1.0;
printf("%lf\n",e*w);
}
}
题目大意:给定一个整数n,构建一个长度为n的数组a,数组下标分别为a[0],a[1],,,a[n-1]。前提是它必须是一个漂亮数组:例如,当n==4的时候,a[0]=1; a[1]=2; a[2]=1; a[3]=0。0出现了一次,1出现了两次,2出现了1次,3出现了0次,所以这就构成了漂亮数组。如果可以构建成漂亮数组,就输出数组,不能就输出-1。
在草稿上打表就能发现规律
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int main(){
int n;
cin>>n;
if(n<=3||n==6){
cout<<"-1"<<endl;
}
else if(n==4){
cout<<"1 2 1 0"<<endl;
}
else if(n==5){
cout<<"2 1 2 0 0"<<endl;
}
else if(n==7){
cout<<"3 2 1 1 0 0 0"<<endl;
}
else{
for(int i=0;i<n;i++)
{
if(i==0){
a[0]=n-4;
}
else if(i==1){
a[1]=2;
}
else if(i==2){
a[2]=1;
}
else if(i==n-4){
a[n-4]=1;
}
cout<<a[i]<<" ";
}
cout<<endl;
}
}
题目大意:求有几个ybb?(ybbb,ybbbb,ybbbbbbbbbbbb都各自算一个)。
最少有两个b才算一个ybb
#include<bits/stdc++.h>
void solve();
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
solve();
}
}
void solve(){
int n,i,j,b[105]={0},w=0,sum=0;
char a[105];
cin>>n;
for(i=0;i<n;i++){
cin>>a[i];
}
for(i=0;i<n-1;i++){
if(a[i]=='y'){
for(j=i+1;j<n;j++){
if(a[j]!='b'){
w=0;
break;
}
w++;
if(w>=2){
sum++;
}
}
}
}
cout<<sum<<endl;
}
题目大意:我必须在k-1分钟之前到达剑会到达的位置就可以成功拦截它。
bfs
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
char a[2002][2002];
int dist[2002][2002];
int t,n,m;
int x,y;
int dx[]={-1,0,0,1},dy[]={0,1,-1,0};
int bfs()
{
queue<PII> q;
memset(dist,-1,sizeof dist);
dist[x][y]=0;
q.push({x,y});
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int xx=t.first+dx[i],yy=t.second+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]!='#'&&dist[xx][yy]==-1)
{
dist[xx][yy]=dist[t.first][t.second]+1;
q.push({xx,yy});
}
}
}
return dist[n][m];
}
int main()
{
cin.tie(0); cout.tie(0);
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='H') x=i,y=j;
}
}
bfs();
int k;
cin>>k;
int flag=-1;
int minn=0x3f3f3f3f;
for(int i=0;i<k;i++)
{
int A,B;
cin>>A>>B;
if(dist[A][B]!=-1&&dist[A][B]<=i)
{
flag=i;
minn=min(i,minn);
}
}
if(flag==-1) cout<<"NO"<<endl;
else cout<<"YES "<<minn<<endl;
}
return 0;
}
题目大意:根据得分判断处在cf的什么名称,如果变化就输出名称之间的变化。
简单打表
#include<bits/stdc++.h>
void solve();
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
solve();
}
}
void solve(){
int n,k,m;
string s,y;
cin>>n>>k;
if(k<1200){
s="Newbie";
}
else if(k>=1200&&k<=1399){
s="Pupil";
}
else if(k>=1400&&k<=1599){
s="Specialist";
}
else if(k>=1600&&k<=1899){
s="Expert";
}
else if(k>=1900&&k<=2099){
s="Candidate master";
}
else if(k>=2100&&k<=2299){
s="Master";
}
else if(k>=2300&&k<=2399){
s="International master";
}
else if(k>=2400&&k<=2599){
s="Grandmaster";
}
else if(k>=2600&&k<=2999){
s="International grandmaster";
}
else if(k>=3000){
s="Legendary grandmaster";
}
for(int i=0;i<n;i++){
cin>>m;
k+=m;
if(k<1200){
y="Newbie";
}
else if(k>=1200&&k<=1399){
y="Pupil";
}
else if(k>=1400&&k<=1599){
y="Specialist";
}
else if(k>=1600&&k<=1899){
y="Expert";
}
else if(k>=1900&&k<=2099){
y="Candidate master";
}
else if(k>=2100&&k<=2299){
y="Master";
}
else if(k>=2300&&k<=2399){
y="International master";
}
else if(k>=2400&&k<=2599){
y="Grandmaster";
}
else if(k>=2600&&k<=2999){
y="International grandmaster";
}
else if(k>=3000){
y="Legendary grandmaster";
}
if(s!=y){
cout<<s<<" -> "<<y<<endl;
s=y;
}
}
cout<<s<<endl;
}
牛客集训营3总结
简答比较首字母
#include<bits/stdc++.h>
void solve();
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
solve();
}
}
void solve(){
string s,k;
cin>>s>>k;
if(s[0]==k[0]||abs(s[0]-k[0])==32){
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
return;
}
当原始数字串长度为奇时一定存在两个相邻的数,和为偶数
则当n为奇数时qcjj赢,反之zn赢
#include<bits/stdc++.h>
using namespace std;
void solve(){
long long n,m;cin >> n;
for(int i=0;i<n;i++){
cin>>m;
}
if(n&1) cout << "qcjj" << endl;
else cout << "zn" << endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin>>T;
while(T--){
solve();
}
}
chino's bubble sort and maximum subarray sum(easy version)
最大字段和
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
long long A[N];
long long B[N];
long long qiu(int n);
int main()
{
int n, k;
cin >> n >> k;
for (int i=0;i<n;i++)
{
cin >> A[i];
}
if(k==0)
{
long long max_B;
max_B=qiu(n);
cout << max_B << endl;
}
if(k==1)
{
long long max_B[n];
for(int j=0;j<n-1;j++)
{
int t;
t=A[j];
A[j]=A[j+1];
A[j+1]=t;
max_B[j]=qiu(n);
t=A[j];
A[j]=A[j+1];
A[j+1]=t;
}
sort(max_B, max_B+n-1, greater<long long>());
cout << max_B[0] << endl;
}
return 0;
}
long long qiu(int n)
{
B[0]=A[0];
for (int j=1;j<n;j++)
{
B[j]=max((B[j-1]+A[j]), A[j]);
}
long long max_B=B[0];
for (int i=0;i<n;i++)
{
if (B[i]>max_B)
{
max_B=B[i];
}
}
return max_B;
}
vector<array<ll,3>> cmp;
int pending(array<ll,4> a){
for(auto [x,y,o]:cmp){
if(o==1) { if(a[x]>=a[y]) return 0; }
else { if(a[x]<a[y]) return 0; }
}return 1;
}//判断是否满足所有关系
void solve()
{
ll n,x,y,o;
cin >> n;
cmp.clear();
FORLL(i,1,n){
cin >> x >> y >> o;
cmp.pb({x,y,o});
}
int ans=0;
FORLL(i,1,3) FORLL(j,1,3) FORLL(k,1,3) ans|=pending({0,i,j,k});
//存在满足所有关系的情况即可
cout << (ans?YES:NO);
}
2.17训练赛总结
判断年份范围,求闰年个数
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,m,j,sum=0;
cin>>n>>m;
if(n+m>9999){
m=9999-((n+m)-9999);
}
else{
m+=n;
}
if(n>m){
j=n;
n=m;
m=j;
}
for(int i=n;i<=m;i++){
if(i%4==0&&i%100!=0){
sum++;
}
else if(i%400==0){
sum++;
}
}
cout<<sum<<endl;
}
int main(){
int a;
cin>>a;
while(a--){
solve();
}
}
终极串每次都能分割出只有单个字母的回文串,终极串长度就是所有字符串长度之和
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,sum=0;
string a;
cin>>n;
for(int i=0;i<n;i++){
cin>>a;
sum+=a.size();
}
cout<<sum<<endl;
}
int main(){
//int a;
//cin>>a;
//while(a--){
solve();
//}
}
画图,注意转义字符
#include<bits/stdc++.h>
using namespace std;
void solve(){
string s;
cin>>s;
}
int main(){
solve();
cout<<" __ _____\n"
"| | ___/ ____\\____\n"
"| |/ /\\ __\\/ ___\\\n"
"| < | | \\ \\___\n"
"|__|_ \\ |__| \\___ >\n"
" \\/ \\/";
}
拓扑排序,优先队列
#include<bits/stdc++.h>
using namespace std;
void solve(){
vector<int>v[1005],f;
int n,m,a,b,g[1005]={0};
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b;
v[a].push_back(b);
g[b]++;
}
priority_queue<int,vector<int>,greater<int>>q;
for(int i=1;i<=n;i++){
if(!g[i]){
q.push(i);
}
}
while(!q.empty()){
int w=q.top();
q.pop();
f.push_back(w);
for(int i=0;i<v[w].size();i++){
int e=v[w][i];
g[e]--;
if(!g[e]){
q.push(e);
}
}
}
for(int i=0;i<f.size();i++){
if(i){
cout<<' ';
}
cout<<f[i];
}
cout<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin>>T;
while(T--){
solve();
}
}
计算百分比(m*100/n)
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,m,w;
double num;
cin>>n>>m;
cout<<"[";
for(int i=1;i<=m;i++){
cout<<"#";
}
for(int i=m+1;i<=n;i++){
cout<<"-";
}
cout<<"]"<<' ';
w=m*100/n;
printf("%d%%\n",w);
}
int main(){
int a;
cin>>a;
while(a--){
solve();
}
}
#include<bits/stdc++.h>
using namespace std;
void solve(){
long long a,b,c,d,n=0,sum=0;
cin>>a>>b>>c>>d;
while(a){
sum+=a%10;
a/=10;
}
if(sum>=16||sum==6){
n++;
}
sum=0;
while(b){
sum+=b%10;
b/=10;
}
if(sum>=16||sum==6){
n++;
}
sum=0;
while(c){
sum+=c%10;
c/=10;
}
if(sum>=16||sum==6){
n++;
}
sum=0;
while(d){
sum+=d%10;
d/=10;
}
if(sum>=16||sum==6){
n++;
}
sum=0;
if(n==0){
cout<<"Bao Bao is so Zhai......"<<endl;
}
else if(n==1){
cout<<"Oh dear!!"<<endl;
}
else if(n==2){
cout<<"BaoBao is good!!"<<endl;
}
else if(n==3){
printf("Bao Bao is a SupEr man///!\n");
}
else if(n==4){
cout<<"Oh my God!!!!!!!!!!!!!!!!!!!!!"<<endl;
}
}
int main(){
//int a;
//cin>>a;
//while(a--){
solve();
//}
}
每层楼都清空重新计算垃圾种类
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,sum;
cin>>n;
sum=0;
for(int i=0;i<n;i++){
unordered_map<char,bool>v;
string s;
cin>>s;
for(int j=0;j<s.size();j++){
if(s[j]!='.'&&!v[s[j]]){
sum++;
v[s[j]]=1;
}
}
}
cout<<sum<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int a;
cin>>a;
while(a--){
solve();
}
}