zoukankan      html  css  js  c++  java
  • 2019西北大学新生训练第一弹题解

    https://vjudge.net/contest/325824#overview
    只有后4题和H题和I题的题解,其他题只挂了代码。不会的同学去群里问问过的同学。

    1. N题 思维题
      题解:没魔法的时候:按顺序来,用一个cnt来计数,遇到左括号++,右括号就消耗一个–,中间有一次cnt<0那么代表这个串已经不合法了输出No。有魔法的时候其实就是cnt<0有一次机会,那么我们第一次cnt<0不输出No就可以了。
      这道题对应的是CF1200分难度的题。大家先对难度有一个模糊的概念。
      代码:看了一圈只有littlefish(19 小?)的代码相对简单点
    #include<stdio.h>
    int main(void){
    	int n;
    	char a[220000];
    	scanf("%d",&n);
    		int i=0,j=0,k=0,t=0;
    		scanf("%s",&a);
    		for(i=0;i<n;i++){
    			if(a[i]=='(') j++; else j--;
    			if(j==-2) break;
    		}
    		if (j!=0) printf("No"); else printf("Yes");
    	return 0;
    }
    

    我的代码(c++,可以尝试去熟悉下c++,看不懂没关系,只是熟悉下

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define forn(i,n) for(int i=0;i<n;i++)
    #define for1(i,n) for(int i=1;i<=n;i++)
    #define IO ios::sync_with_stdio(false);cin.tie(0)
    const int inf = 0x3f3f3f3f;
    const ll INF = 0x3f3f3f3f3f3f3f3f;
     
    int main(){ 
        IO;
        int n;cin>>n;
        string s;cin>>s;
        int cnt = 0;
        bool ok = 1;
        forn(i,n){
            if(s[i]=='(') cnt++;
            else{
                if(cnt) cnt--;
                else{
                    if(ok) ok = 0;
                    else return cout<<"No"<<'
    ',0;
                }
            }
        }
        if(!ok) cnt--;
        if(cnt) return cout<<"No"<<'
    ',0;
        cout<<"Yes"<<'
    ';
        return 0;
    }
    
    1. M题 模拟题直接看代码吧
      最好看的是Libm学长的代码(c++版,但是基本和C语言差不多,cout是printf,头文件无所谓,看看思路就可以了
    #include <bits/stdc++.h>
    #define ll long long
    #define endl '
    '
    using namespace std;
    int main(){
    	int n; 
    	while(cin>>n){
    		int s[100][100];
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=i;j++){
    				s[i][j]=s[i-1][j]+s[i-1][j-1];
    				s[1][1]=1;
    				if(j!=i) cout<<s[i][j]<<" "; 
    				else cout<<s[i][j]<<endl;
    			}
    		}
    		cout<<endl;
    	}
    }
    
    1. L题 模拟题
      有很多人写的很麻烦,同样直接上代码
      代码:
      1. Anonytt(第一弹Top 1)
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	while(cin>>n){
    		if(n==0) break;
    		int a=0,q=n;
    		while(q>0){
    			a+=q%10;
    			q/=10;
    		}
    		int b=0;
    		q=n;
    		while(q>0){
    			b+=q%12;
    			q/=12;
    		}
    		int c=0;
    		q=n;
    		while(q>0){
    			c+=q%16;
    			q/=16;
    		}
    		if(a==b&&b==c) printf("%d is a Sky Number.
    ",n);
    		else printf("%d is not a Sky Number.
    ",n);
    	}
    }
    

    我的代码

    #include <bits/stdc++.h>
    using namespace std;
    bool check(int n){
        int x,y,z,sum1 = 0,sum2 = 0,sum3 = 0;x = y = z = n;
        while(x){
            sum1+=x%10;
            x/=10;
        }
        while(y){
            sum2+=y%12;
            y/=12;
        }
        while(z){
            sum3+=z%16;
            z/=16;
        }
        return (sum1==sum2&&sum1==sum3);
    }
    
    int main(){
        int n;
        while(cin>>n&&n){
            if(check(n)) cout<<n<<" is a Sky Number.
    ";
            else cout<<n<<" is not a Sky Number.
    ";
        }
        return 0;
    }
    
    1. K题 求多个数lcm
      思路:学会gcd(辗转相除法)之后,就迎刃而解了。a和b的lcm = a/gcd(a,b)*b(先除可以防止有些题爆int或者爆long long)
      那么多个数就一个个来呗。
      代码:
      同样是Top1的代码
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	while(cin>>n){
    		int a[n+5],ans;
    		cin>>a[1];
    		ans=a[1];
    		for(int i=2;i<=n;i++){
    			cin>>a[i];
    			ans=ans/__gcd(ans,a[i])*a[i];
    		}
    		cout<<ans<<endl;
    	}
    }
    

    Libm代码c++

    #include <bits/stdc++.h>
    #define ll long long
    #define endl '
    '
    using namespace std;
    int main(){
    	ios::sync_with_stdio(0);cin.tie(0);
    	int n; 
    	while(cin>>n){
    		ll now;
    		for(int i=1;i<=n;i++){
    			if(i==1) cin>>now;
    			else{
    				ll t;cin>>t;
    				now=now*t/__gcd(now,t);
    			}
    		}
    		cout<<now<<endl;		
    	}
    }
    
    1. H题
      大家都是用冒泡排序做的,这种排序的时间复杂度很高或者说很慢,但是这题不卡。有个别会c++的同学用的sort做的,比如Top2Top3
      直接上代码吧,不会冒泡的去百度冒泡排序
      Top1代码
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	while(cin>>n&&n){
    		int a[100],b[100];
    		for(int i=1;i<=n;i++){
    			cin>>a[i];
    		}
    		int temp=0;
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=n-i;j++){
    				if(abs(a[j])>abs(a[j+1])){
    					temp=a[j];
    					a[j]=a[j+1];
    					a[j+1]=temp;
    				}
    			}
    		}
    		cout<<a[n];
    		for(int i=n-1;i>=1;i--){
    			cout<<" "<<a[i];
    		}
    		cout<<endl;
    	}
    }
    

    那么用sort怎么在c++做呢,c++里面有一个自带函数sort,排序速度很快,时间复杂度是O(n*logn)的。举个例子1e5(100000)个数字,冒泡排序最慢要5秒多,sort只用10-20ms.
    Top3代码 看不懂没关系

    #include <bits/stdc++.h>
    using namespace std;
    bool cmp(int a,int b){
    	return abs(a) > abs(b);
    }
    int a[110];
    int main()
    {
    	int n;
    	while(cin >> n&&n){
    		for(int i = 0; i < n; i++)	cin >> a[i];
    		sort(a,a+n,cmp);
    		cout << a[0];
    		for(int i = 1; i < n; i++)	cout <<" " << a[i] ;
    		
    		cout << endl;
    	}
       	
        return 0;
    }
    
    1. I题
      思路:一个数x从如果都不能被【2-sqrt(x)】这之间的数整除那么就是素数。
      代码:
      我的c++版
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define forn(i,n) for(int i=0;i<n;i++)
    #define for1(i,n) for(int i=1;i<=n;i++)
    #define IO ios::sync_with_stdio(false);cin.tie(0)
    
    bool judge(int x){
        x = x*x+x+41;
        int z = sqrt(x);
        for(int i = 2;i<=z;i++){
            if(x%i==0) return 0;
        }
        return 1;
    }
    
    int main(){
        IO;
        int l,r;
        while(cin>>l>>r&&(l||r)){
            bool ok = 1;
            for(int i = l;i<=r;i++){
                if(!judge(i)) ok = 0;
            }
            if(ok) cout<<"OK"<<'
    ';
            else cout<<"Sorry"<<'
    ';
        }
        return 0;
    }
    

    做不完题没关系,我刚入坑acm的时候新生已经出到第4弹了,我从第一弹才开始刷,后来在新生赛前已经追上了Top的进度


    分界线
    被压榨成功,我把所有题代码都粘出来,下次别压榨我了。orz 因为我急着补题,博客简单写了,看到好看Top的代码就粘过来了。求轻喷

    1. A题
      在题目下面有答案
    2. B题
      代码:
      C版
    #include<stdio.h>
    
    int main()
    {
    	unsigned int a,sum,i;
    	while(scanf("%d",&a) != EOF)
    	{
    		sum = 0;
    		for(i = 1;i <= a;i++)
    			sum += i;
    		printf("%d
    
    ",sum);
    	}
    	return 0;
    }
    

    c++版

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int a;
    	while(cin>>a)
    	{
    		int c=0;
    		for(int i=1;i<=a;i++)
    		{
    			c+=i;
    		}
    		cout<<c<<endl;
    		cout<<endl;
    	}
    }
    
    1. C题
      c
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int main(){
    	double x;
    	while(~scanf("%lf",&x)){
    		printf("%.02lf
    ",abs(x));
    	}
    	return 0;
    }
    

    c++

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	double a;
    	while(cin>>a)
    	{
    		double c=abs(a);
    		printf("%.2f
    ",c);
    		
    	}
    }
    
    1. D题
      C
    #include<stdio.h>
    #define PI 3.1415927
    int main(void)
    {
    	double r,v;
    	while(~scanf("%lf",&r))
    	{
    		v=r*r*r*PI*4/3;
    		printf("%.3lf
    ",v);
    	}
    	return 0;
    }
    

    C++

    #include<bits/stdc++.h>
    using namespace std;
    #define PI 3.1415927
    int main()
    {
    	double a;
    	while(cin>>a)
    	{
    		double c=4*PI*a*a*a/3;
    		printf("%.3f
    ",c);
    		
    	}
    }
    
    1. E题
      C
    #include<stdio.h>
    int main(void)
    {
        int n;
        scanf("%d
    ",&n);
        while(n>0)
        {
            float a,b,c;
            scanf("%f%f%f",&a,&b,&c);
            if(a>=b+c)
            printf("NO
    ");
            else if(b>=a+c)
            printf("NO
    ");
            else if(c>=a+b)
            printf("NO
    ");
            else
            printf("YES
    ");
            n--;
        }
        return 0;
    }
    

    C++

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	cin>>n;
    	while(n--)
    	{
    		double a,b,c;
    		cin>>a>>b>>c;
    		if(a+b>c&a+c>b&&b+c>a) cout<<"YES"<<endl;
    		else cout<<"NO"<<endl;
    	}
    }
    
    1. F
      C
    #include <stdio.h>
    int main(void)
    {
    	int n;
    	while(~scanf("%d",&n))
    	{
    		if(n<60&&n>=0)
    		printf("E
    ");
    		else if(n<70&&n>=60)
    		printf("D
    ");
    		else if(n<80&&n>=70)
    		printf("C
    ");
    		else if(n<90&&n>=80)
    		printf("B
    ");
    		else if(n<=100&&n>=90)
    		printf("A
    ");
    		else
    		printf("Score is error!
    ");
    	}
    	return 0;
    }
    

    C++

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	double n;
    	while(cin>>n)
    	{
    		if(n>=90&&n<=100) cout<<"A"<<endl;
    		else if(n>=80&&n<=89) cout<<"B"<<endl;
    		else if(n>=70&&n<=79) cout<<"C"<<endl;
    		else if(n>=60&&n<=69) cout<<"D"<<endl;
    		else if(n>=0&&n<=59) cout<<"E"<<endl;
    		else cout<<"Score is error!"<<endl;		
    	}
    }
    
    1. G
      C
    #include <stdio.h>
    #include <math.h>
    int main(void)
    {
    	double x1,y1,x2,y2,a,b,c;
    	while(~scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2))
    	{
    		a=(x1-x2)*(x1-x2);
    	        b=(y1-y2)*(y1-y2);
    		c=(a+b);
    		printf("%.2lf
    ",sqrt(c));
    	}
    	return 0;
    }
    

    c++

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	double a,b,c,d;
    	while(cin>>a>>b>>c>>d)
    	{
    		double l;
    		l=sqrt((c-a)*(c-a)+(d-b)*(d-b));
    		printf("%.2f
    ",l);
    	}
    }
    
    1. J
      C
    #include<stdio.h>
    int main(void)
    {
    	int n,x;
    	while(~scanf("%d",&n))
    	{
    		x=1;
    		while(n>1)
    		{
    			x=x*2+2;
    			n--;
    		}
    		printf("%d
    ",x);
    	}
        return 0;
    }
    

    C++

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	while(cin>>n){
    		int sum=1;
    		for(int i=1;i<=n-1;i++){
    			sum=(sum+1)*2;
    		}
    		cout<<sum<<endl;
    	}
    }
    
  • 相关阅读:
    简单的java socket 示例
    Java Socket编程
    session的常用方法。
    Request与session与application的区别
    百度echart使用心得,百度图表。
    SpingMVC ModelAndView, Model,Control以及参数传递
    Flume理论研究与实验
    RocketMq在SparkStreaming中的应用总结
    数据实践过程中理论总结
    flink-vs.-spark
  • 原文地址:https://www.cnblogs.com/AlexPanda/p/12520297.html
Copyright © 2011-2022 走看看