24寒假训练第四周总结

总结

虽然三场比赛都参加了,但是部分题目的补题效果还没有特别理想,因为一些题目相对现在的水平而言还是有点大的难度,内容可能没什么知识基础,当然一些接触过的题目类型补起来就比较好了,重新写的时候也可以一下子想出思路,这是补题带来的一些收获。目前还是只能过签到和签到plus的题目(苦笑),尤其是在牛客训练营的比赛的时候感到十分吃力尽管有思路和想法还是WA,由此可见还有很多需要进步的地方,还需要继续努力学习算法知识刷刷算法题。当然,相对于寒假训练前的水平也提高了不少,尤其是更进一步操练了常用的算法如拓扑排序、二分、dp、贪心等等算法,为这一周和春节假期间的加训带来的进步和付出的努力点个赞,再接再厉下一周。

2.5训练赛总结


 A - All in!

签到题

#include<bits/stdc++.h>
using namespace std;

int main(){
	cout<<"All in!"<<endl;
}

B - Boboge and Tall Building

题目大意: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);
	}
}

C - Constructive Problem

题目大意:给定一个整数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;
    }
}

D - Diseased String

题目大意:求有几个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;
}

F - Future Vision

题目大意:我必须在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;
}

J - Jiubei and Codeforces

题目大意:根据得分判断处在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;
}

智乃的比较函数(easy version)

智乃的比较函数(normal version)

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训练赛总结

B - BM 算日期

判断年份范围,求闰年个数

#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();
	}
} 

D - Palindrome Hard Problem

终极串每次都能分割出只有单个字母的回文串,终极串长度就是所有字符串长度之和

#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();
	//}
} 

E - BM 充饥

画图,注意转义字符

#include<bits/stdc++.h>
using namespace std;

void solve(){
	string s;
	cin>>s;
	
}

int main(){
		solve();
        cout<<" __      _____\n"
          "|  | ___/ ____\\____\n"
          "|  |/ /\\   __\\/ ___\\\n"
          "|    <  |  | \\  \\___\n"
          "|__|_ \\ |__|  \\___  >\n"
          "     \\/           \\/";
} 

G - New Game

拓扑排序,优先队列

#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();
	}
}

H - Hsueh- Draw Progress

计算百分比(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();
	}
}

I - BM 旅游

#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();
	//}
} 

J - 大扫除

每层楼都清空重新计算垃圾种类

#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();
	}
}

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值