2020.11.27哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛)

A 抗疫必胜1

在这里插入图片描述
水题 不解释

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

int main()
{
    
    
   cout<<"V"<<"     "<<"V"<<endl;
   cout<<" "<<"V"<<"   "<<"V"<<endl;
   cout<<"  "<<"V"<<" "<<"V"<<endl;
   cout<<"   "<<"V";
}

B 疫情死亡率

在这里插入图片描述

水题 (但是我的codeblocks坏了,用浮点数时会输出0.0000000,现下Dev做的,淦)

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

typedef long long ll;

int main()
{
    
    
    int a, b;
    cin>>a>>b;
    double c = 100.0 * b / a;//一定要记得乘以100.0 不然就不能输出浮点数了
	cout<<fixed<<setprecision(3)<<c<<"%";//用于cout输出指定位数的小数点
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
int a,b;
int main()
{
    
    
	cin>>a>>b;
	double c=b*1.0/a;//同样得乘以1.0
	printf("%.3lf%%",c*100);
	return 0;
 } 

C 整除判断

在这里插入图片描述

水题不解释

#include<bits/stdc++.h>
using namespace std;
int a,b;
int main()
{
    
    
	cin>>a>>b;
	if(a % b == 0) cout<<"YES";
    else cout<<"NO";
    return 0;
 }

D 编程时间

在这里插入图片描述
水题不解释

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

typedef long long ll;

int main()
{
    
    
    int a, b, c, d;
    cin>>a>>b>>c>>d;
    int sum = 60 - b + (c - a - 1) * 60 + d;
    int k = sum / 60;
    cout<<k<<" "<<sum - 60 * k;
    return 0;
}

E 双位彩

在这里插入图片描述

这个题意有点东西啊,我刚开始看不懂题意,对于那个2元的考虑到可能出现的是aa类的数,就是不知道该怎么办,就对于那个2,写了下面一个极傻的方法

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int n, m;
    cin>>n>>m;
    int a = n % 10;
    int b = (n / 10) % 10;
    int c = m % 10;
    int d = (m / 10) % 10;
    if(n == m)
        cout<<100;
    else if(a == d && b == c)
        cout<<20;
    else if((a == c && b != c && a != d && b != d) || (b == c && a != c && a != d && b != d) || (c != a && c!=b && d == a && d != b)|| (c != a && c!=b && d == b && d != a))
        cout<<2;
    else
        cout<<0;
}

后来结赛看见别人代码发现是我想多了

#include<iostream>
using namespace std;
int main(){
    
    
int a,b;
cin>>a>>b;
int a1=a/10;
int a2=a%10;
int b1=b/10;
int b2=b%10;
if(a==b){
    
    
cout<<"100";
}else if(a1==b2&&a2==b1){
    
    
cout<<"20";
}else if(a1==b2||a2==b1||a1==b1||a2==b2){
    
    //只要我抽的数字有一个能和中奖数字相同就行
cout<<"2";
}else{
    
    
cout<<"0";
}
}

F 抗疫必胜2

在这里插入图片描述

水题不解释

扫描二维码关注公众号,回复: 12176761 查看本文章
#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
   int n;
   cin>>n;
   while(n--)
   {
    
    
       cout<<"China will win the battle against COVID-19."<<endl;
   }
}

G 成绩统计

在这里插入图片描述

水题

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

typedef long long ll;	

int main()
{
    
    
    ll n;
    ll sum = 0;
    ll tr[10005];
    cin>>n;
    for(int i = 0; i < n; i++)
    {
    
    
        cin>>tr[i];
        sum += tr[i];
    }
    double k = 1.0 * sum / n;
    //cout<<sum<<" "<<k;
    sort(tr, tr + n);//其实没必要用数组的,我就是懒得在循环里面写比较语句来找最大最小数,所以写个sort直接取第一个和最后一个数就行。
    cout<<fixed<< setprecision(2)<<k;
    cout<<" "<<tr[n - 1]<<" "<<tr[0];
    return 0;
}

H 抗疫必胜3

在这里插入图片描述
抗疫必胜1的升级版
把握好循环的次数就行
这方面的题做得还是太少,所以写的就慢了点(愁人)

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

int main()
{
    
    
    int n;
    cin>>n;
    for(int i = 1; i <= n; i++)
    {
    
    
        for(int j = 1; j < i; j++)
        {
    
    
            cout<<" ";
        }
        cout<<"V";
        for(int j = 0; j < 2 * (n - i) - 1; j++)
        {
    
    
            cout<<" ";
        }
        if(i != n)
            cout<<"V"<<endl;
    }
}

I 统计数据

在这里插入图片描述

刚开始没做这个题,是因为觉得得计数,用map嫌麻烦就后做这个题,后来发现不用也可以其实

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>

struct tangran
{
    
    
    int a, b;
}tr[10005];

bool cmp(tangran x, tangran y)
{
    
    
    return x.a > y.a;
}

using namespace std;

map<int,int>mp;

int main()
{
    
    
    int t, n, m;
    scanf("%d",&n);
    for(int j = 1; j <= n; j++)
    {
    
    
        scanf("%d",&m);
        if(!mp.count(m))
            mp[m] = 0;
        mp[m]++;
    }
    std::map<int,int>::iterator it;
    int j = 0;
    for(it = mp.begin(); it != mp.end(); it++)
    {
    
    
        j++;
        tr[j].a = it->first;
        tr[j].b = it->second;
    }
   // cout<<j;
    sort(tr + 1, tr + j + 1, cmp);
    for(int i = 1; i <= j; i++)
    {
    
    
        cout<<tr[i].a<<"-"<<tr[i].b<<endl;
    }

    return 0;
}

这个做法看起来是不是真麻烦……

#include<bits/stdc++.h>
using namespace std;
int a,b;
int tr[10005] = {
    
    0};
int main()
{
    
    
	int n;
	cin>>n;
	for(int i = 0; i < n; i++)
    {
    
    
        cin>>a;
        tr[a]++;
        b = max(b,a);//记录最大的数
    }
    for(int i = b; i > 0; i--)
    {
    
    
        if(tr[i] != 0)
            cout<<i<<"-"<<tr[i]<<endl;
    }
	return 0;
 }

这个是不是简单易懂……(学的东西多了,就会把简单的问题复杂化……)

J 子序列求和

在这里插入图片描述
水题

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int tr[10005];
    int n, m, a, b;
    cin>>n;
    for(int i = 1; i <= n; i++)
    {
    
    
        cin>>tr[i];
    }
    cin>>m;
    while(m--)
    {
    
    
        int sum = 0;
        cin>>a>>b;
        if(a > n)
            cout<<0<<endl;
        else if(n >= a && n <= b)
        {
    
    
            for(int i = a; i <= n; i++)
            {
    
    
                sum += tr[i];
            }
            cout<<sum<<endl;
        }
        else
        {
    
    
            for(int i = a; i <= b; i++)
            {
    
    
                sum += tr[i];
            }
            cout<<sum<<endl;
        }
    }
}

K Simple Question

在这里插入图片描述

水题

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int n,m,k;
    int a = 0;
    cin>>n>>m>>k;
    for(int i = k; i >0; i--)
    {
    
    
        if(i % n == 0 && i % m == 0)
        {
    
    
            cout<<i<<endl;
            a = 1;
            break;
        }
    }
    if(a == 0)
        cout<<-1;
}

L Wrong Word

在这里插入图片描述
这个题和上面的那个I题一样,用map,不过这次是map<char, int>
这个题就是C(n,m)的利用。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<char, int>mp;

ll f(ll a, ll b)
{
    
    
    ll j = 1;
    if(b > a/2+1)
        b = a-b;
   for(ll i=1; i<=b; ++i)
   {
    
    
       j*=(a-i+1);
       j/=i;
   }
    return j;
}

int main()
{
    
    
    int k = 1;
    int m = 1;
    int sum = 0;
    string s;
    cin>>s;
    int n = s.size();
    for(int i = 0; i < n; i++)
    {
    
    
        mp[s[i]]++;
    }
    map<char, int>::iterator it ;
    for(it = mp.begin(); it != mp.end(); it++)
    {
    
    
        k *= f(n, it->second);
        n = n - it->second;
    }
    cout<<k - 1<<endl;

    return 0;
}

这个方法同样显得很笨拙……(但我不想改了,时间不多了)

M Mutable Array

在这里插入图片描述
这个题有点小思维,就是求出最小的数,和最大的数,然后中间的数肯定能取得到

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    
    
    ll n,ma,mi;
    cin>>n>>mi>>ma;
    ll a = (n - 1) * ma + mi;
    ll b = (n - 1) * mi + ma;
    cout<<a - b + 1<<endl;

}

N Interesting Number

在这里插入图片描述
这个题也是思维题,你想想只有三个因子,一个是1,一个是n,另一个必然是根号n!!!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool is_prime(ll n)
{
    
    
    if(n == 1)
        return 0;
    else
    {
    
    
        for(int i = 2; 1ll * i * i <= n; i++)
        {
    
    
            if(n % i == 0)
            {
    
    
                return 0;
            }
        }
        return 1;
    }

}

int main()
{
    
    
    ll n;
    ll sum = 0;
    cin>>n;
    for(int i = 2; i <=sqrt(n); i++)
    {
    
    
        if(is_prime(i))
        {
    
    
            sum++;
        }
    }
    cout<<sum;
}

O Find Difference

在这里插入图片描述
又是一个思维题,就是当n不为1时,只需要一次就能算出来!!!(你可以从第i堆拿出i个硬币,然后用得到的重量减去1+2+3+……+i 就得到是哪一堆了)

#include <bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int n;
    cin>>n;
    if(n == 1) cout<<0;
    else cout<<1;
    
}

P Dismantling Number

在这里插入图片描述
直接暴力啊!!!

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

int main()
{
    
    
    ll n, m, i;
    cin>>n;
    for(int i = 1; i <= 30; i++)
    {
    
    
        for(int j = 1; j <= 30; j++)
        {
    
    
            for(int k = 1; k <= 30; k++)
            {
    
    
                if(pow(2, i) + pow(2, j) + pow(2, k) == n)
                {
    
    
                    cout<<"YES";
                    return 0;
                }
            }
        }
    }
    cout<<"NO";
    return 0;
}



Q Finite Decimal

在这里插入图片描述

我上来的思路是分母这个数必须只有2,5这两个因子(什么?为什么?想想就知道了……),但是代码比较“丑”

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

bool is_prime(ll n)
{
    
    
    if(n == 1)
        return 0;
    for(int i = 2; 1ll * i * i <= n; ++i)
    {
    
    
        if(n % i == 0)
            return 0;
    }
    return 1;
}

int main()
{
    
    
    int n, k, m, j;
    cin>>n;
    while(n--)
    {
    
    
        k = 0;
        j = 2;
        cin>>m;
        if(m == 2)//当时写到最后就被2这个数据卡住了,但是因为debug了好久,就懒得再去改去优化,就直接一个if从句判断了
            cout<<"YES"<<endl;
        else if(is_prime(m) == 1 && m != 5)
        {
    
    
            cout<<"NO"<<endl;
        }
        else
        {
    
    
            while(1)
            {
    
    
                if(m % 2 == 0)
                {
    
    
                    m = m / 2;
                }
                if(m % 5 == 0)
                {
    
    
                    m = m / 5;
                }
                if(m % 2 != 0 && m != 1)
                {
    
    
                    j = 0;
                }
                if(m % 5 != 0 && m != 1)
                {
    
    
                    if(j == 0)
                    {
    
    
                        k = 0;
                        break;
                    }
                }
                if(m == 1)
                {
    
    
                    k = 1;
                    break;
                }

            }
            // cout<<m;

            if(k == 1)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }

    }
    return 0;
}



后来听djk说还有一个方法,因为是要看是不是有限小数,就说明小数点后面的位数是确定的,我们可以乘以1e18,就相当于用1e18除以分母,如果能除尽,则是有限小数

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
    
    
	int n;
	long long  int b,c;
	int a;
	cin>>n;
	while(n--){
    
    
		cin>>a;
		b=1e18;
		
		if(b%a){
    
    
			cout<<"NO"<<endl;
		}
		else{
    
    
			cout<<"YES"<<endl;
		}
	}
	return 0;
}

还有三个题暂时不会……………………
总结:对于这次网络赛来说,比较简单,但是有些题耽误时间过多,比如那个彩票题和那个用map的题,简单来说就是题读不懂,加上不熟练,还有就编译器的问题,让我不能用浮点数,得现下Dev解决问题,然后还有就对浮点数的题做的太少,还是有待提高。

猜你喜欢

转载自blog.csdn.net/weixin_51216553/article/details/110293208