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"<<'\n',0;
            }
        }
    }
    if(!ok) cnt--;
    if(cnt) return cout<<"No"<<'\n',0;
    cout<<"Yes"<<'\n';
    return 0;
}
  1. M題 模擬題直接看代碼吧
    最好看的是Libm學長的代碼(c++版,但是基本和C語言差不多,cout是printf,頭文件無所謂,看看思路就可以了
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
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",n);
		else printf("%d is not a Sky Number.\n",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.\n";
        else cout<<n<<" is not a Sky Number.\n";
    }
    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 '\n'
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"<<'\n';
        else cout<<"Sorry"<<'\n';
    }
    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\n\n",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\n",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\n",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\n",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\n",c);
		
	}
}
  1. E題
    C
#include<stdio.h>
int main(void)
{
    int n;
    scanf("%d\n",&n);
    while(n>0)
    {
        float a,b,c;
        scanf("%f%f%f",&a,&b,&c);
        if(a>=b+c)
        printf("NO\n");
        else if(b>=a+c)
        printf("NO\n");
        else if(c>=a+b)
        printf("NO\n");
        else
        printf("YES\n");
        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\n");
		else if(n<70&&n>=60)
		printf("D\n");
		else if(n<80&&n>=70)
		printf("C\n");
		else if(n<90&&n>=80)
		printf("B\n");
		else if(n<=100&&n>=90)
		printf("A\n");
		else
		printf("Score is error!\n");
	}
	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\n",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\n",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\n",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;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章