NCCCU 20国赛模拟题 C++

1-1

内存限制 64MB单组时间 1Sec 通过 204次 提交 3508次
mokit
题目描述
Excel表列名称由字母A~Z组成,列字母的规律如下:A、B、C…Z、AA、AB…AZ、BA、BB…ZZZZY、ZZZZZ…,现在请你计算2列之间含有多少列单元格。

输入说明
1行,用空格分分隔的2个字符串,分别表示列名称,字符串长度均小于等于5。

输出说明
1行,一个整数,表示两个列之间包含的列数。

输入样例复制
AA AZ

输出样例复制
24

#include<bits/stdc++.h>

using namespace std;

string s;
int a,b;

int main()
{
	cin>>s;
	for(int i=0;i<s.length();++i){
		a*=26;
		a+=s[i]-'A'+1;
	}
	cin>>s;
	for(int i=0;i<s.length();++i){
		b*=26;
		b+=s[i]-'A'+1;
	}
	cout<<abs(a-b)-1;
	return 0;
}

1-2

题目描述
手机键盘上,九键拼音中数字与英文字母成对应关系:2–abc, 3-def, 4-ghi, 5–jkl, 6–mno, 7–pqrs, 8–tuv, 9–wxyz。

输入说明
1行,一个由英文小写字母组成的字符串(长度<=100000)

输出说明
输出1行,对应的九键数字。

输入样例复制
fwgeta

输出样例复制
394382

#include<bits/stdc++.h>

using namespace std;

int a[200],i,t=2;
string s;

int main()
{
	for(i='a';i<='z';++i){
		if(i<='c'){
			a[i]=2;
			continue;
		}
		if(i<='f'){
			a[i]=3;
			continue;
		}
		if(i<='i'){
			a[i]=4;
			continue;
		}
		if(i<='l'){
			a[i]=5;
			continue;
		}
		if(i<='o'){
			a[i]=6;
			continue;
		}
		if(i<='s'){
			a[i]=7;
			continue;
		}
		if(i<='v'){
			a[i]=8;
			continue;
		}
		if(i<='z'){
			a[i]=9;
			continue;
		}
	}
	cin>>s;
	for(i=0;i<s.size();++i)
	{
		cout<<a[s[i]];
	}
	return 0;
}

1-3

内存限制 64MB单组时间 1Sec 通过 191次 提交 1468次
mokit
题目描述
给定两个字符串str1和str2(长度均<=10000),问字符串str2内每个字符是否能在字符串str1内找到。

输入说明
第1行输入字符串str1

第2行输入字符串str2

输出说明
若能找到,则输出‘Y’,否则输出‘N’

输入样例复制
abdcdewrtde

wbaqx

输出样例复制
YYYNN

#include<bits/stdc++.h>

using namespace std;

string s,s2;

int main()
{
	cin>>s>>s2;
	for(int i=0;i<s2.size();++i)
	{
		string t="";
		t+=s2[i];
		if(s.find(t)!=s.npos)cout<<"Y";else cout<<"N";
	}
	
	
	return 0;
}

2-1

内存限制 64MB单组时间 1Sec 通过 142次 提交 2714次
mokit
题目描述
有N个正整数,求这N个正整数两两之间的最大公约数之积。

输入说明
第1行:正整数N(N<=100)

第2行:N个用空格分隔的正整数(<10000)

输出说明
输出这N个正整数两两之间的最大公约数之积,结果对1000000007取模。

输入样例复制
4

6 8 9 10

输出样例复制
24

#include<bits/stdc++.h>

using namespace std;

long long n,a[105],i,j,ans=1;
const int MOD=1000000007;

int main()
{
	cin>>n;
	for(i=0;i<n;++i){
		cin>>a[i];
	}
	for(i=0;i<n;++i)
	{
		for(j=i+1;j<n;++j)
		{
			ans=(ans*__gcd(a[i],a[j]))%MOD;
		}
	}
	cout<<ans;
	return 0;
}

2-2

内存限制 64MB单组时间 1Sec 通过 121次 提交 1810次
mokit
题目描述
有N个正整数,求这N个正整数两两之间的最小公倍数之和。

输入说明
第1行 正整数N(N<=100)。

第2行 N个用空格分隔的正整数(每个正整数不超过10000)。

输出说明
输出这N个正整数两两之间的最小公倍数之和,结果对1000000007取模。

输入样例复制
4

2 3 7 6

输出样例复制
95

#include<bits/stdc++.h>

using namespace std;

long long n,a[105],i,j,ans=0;
const int MOD=1000000007;

long long lcm(long long a,long long b)
{
	return a*b/__gcd(a,b);
}

int main()
{
	cin>>n;
	for(i=0;i<n;++i){
		cin>>a[i];
	}
	for(i=0;i<n;++i)
	{
		for(j=i+1;j<n;++j)
		{
			ans=(ans+lcm(a[i],a[j]))%MOD;
		}
	}
	cout<<ans;
	return 0;
}

2-3

第3202试题返回
内存限制 128MB单组时间 1Sec 通过 105次 提交 1186次
mokit
题目描述
有N个正整数,求这N个正整数两两之间的公共质因数之和。

输入说明
第1行:正整数N(N<100)

第2行: N个空格分隔的正整数(每个元素<10000)

输出说明
输出这N个正整数两两之间的公共质因数之和,结果对1000000007取模。

输入样例复制
4

4 6 8 9

输出样例复制
11

数据范围提示
说明:

4=22,6=23,8=222,9=3*3,所以4与6的公共质因数为2;4与8的公共质因数为2、2;4与9没有公共质因数,记为0。

下面是参考答案,看了输入,以及inline,我直呼内行

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

inline ll lpf(ll a, ll b)
{
    // 比较两个数的大小,值大的数为a,值小的数为b
    if (a < b) {
        swap(a, b);
    }

    for (int i = 2; i <= b; i++) {
        if (a % i == 0 && b % i == 0) {
            return i;
        }
    }
    return 1;
}

int main(int argc, char const* argv[])
{

    int N;
    cin >> N;
    istream_iterator<int> ini(cin);
    vector<int> nums(ini, istream_iterator<int>());
    ll result = 0;

    for (size_t i = 0; i < N; i++) {
        for (size_t j = i + 1; j < N; j++) {
            ll tempi = nums[i], tempj = nums[j];
            while (true) {
                ll temp = lpf(tempi, tempj);
                if (temp != 1) {
                    result += temp;
                    result %= 1000000007;
                    tempi /= temp;
                    tempj /= temp;
                } else {
                    break;
                }
            }
        }
    }

    cout << result;

    return 0;
}

然后是我自己的代码:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MOD=1000000007;
ll i,j,ans,t,va,vb,n,a[105];

ll lpf(ll a,ll b)
{
	if(a<b)swap(a,b);//保证a>b 
	for(int i=2;i<=b;++i)
	{
		if(a%i==0&&b%i==0)return i;
	}
	return 1;
}

int main()
{
	cin>>n;
	for(i=0;i<n;++i)cin>>a[i];
	for(i=0;i<n;++i)
	{
		for(j=i+1;j<n;++j)
		{
			va=a[i];vb=a[j];
			while(1)
			{
				t=lpf(va,vb);
				if(t==1)break;
				ans+=t;
				va/=t;
				vb/=t;
			}
		}
	}
	cout<<ans;
	return 0;
}

3-1

第3203试题返回
内存限制 128MB单组时间 1Sec 通过 129次 提交 1598次
mokit
题目描述
有一时钟,在某时刻的时间为HH:MM:SS(24小时制),求在经过N秒时间(N<86400)后,其时间hh:mm:ss。

输入说明
第一行:输入时间HH:MM:SS

第二行:输入秒数N(N<86400)

输出说明
输出1行,当前时刻经过N秒后的时间,以hh:mm:ss格式表示

输入样例复制
输入样例1:

06:17:22

80

输入样例2:

23:59:59

2

输出样例复制
输出样例1:

06:18:42

输出样例2:

00:00:01

最纯粹的模拟。。

#include<bits/stdc++.h>

using namespace std;

int h,m,s,n;

int main()
{
	scanf("%d:%d:%d%d",&h,&m,&s,&n);
	while(n){
		s++;
		n--;
		if(s==60){
			s=0;
			m++;
			if(m==60){
				m=0;
				h++;
				if(h==24){
					h=0;
				}
			}
		}
	}
	printf("%02d:%02d:%02d",h,m,s);
	return 0;
}

3-2

第3204试题返回
内存限制 128MB单组时间 1Sec 通过 126次 提交 1532次
mokit
题目描述
有一时钟,在某时刻的时间为HH:MM:SS(24小时制),求时钟在N秒(N<86400)之前的时间hh:mm:ss。

输入说明
第一行:输入时间HH:MM:SS

第二行:一个整数秒数N(N<86400)

输出说明
当前时刻N秒之前的时间,以hh:mm:ss格式。

输入样例复制
输入样例1:

06:17:22

80

输入样例2:

00:00:01

2

输出样例复制
输出样例1:

06:16:02

输出样例2:

23:59:59

同上题:最纯粹的模拟

#include<bits/stdc++.h>

using namespace std;

int h,m,s,n;

int main()
{
	scanf("%d:%d:%d%d",&h,&m,&s,&n);
	while(n){
		s--;
		n--;
		if(s==-1){
			s=59;
			m--;
			if(m==-1){
				m=59;
				h--;
				if(h==-1){
					h=23;
				}
			}
		}
	}
	printf("%02d:%02d:%02d",h,m,s);
	return 0;
}

3-3

第3205试题返回
内存限制 128MB单组时间 1Sec 通过 183次 提交 1780次
mokit
题目描述
有一时钟在某时刻的时间为HH:MM:SS(24小时制),在经过一段时间(<24h)后,其时间变为hh:mm:ss 求其中经过了多少秒。

输入说明
第一行:输入时间HH:MM:SS

第二行:输入时间hh:mm:ss

输出说明
1行,为两时刻内经过的秒数。

输入样例复制
输入样例1:

06:16:02

06:17:22

输入样例2:

23:59:59

00:00:01

输出样例复制
输出样例1:

80

输出样例2:

2

模拟yyds
下面代码wa了,看错题了,这个代码求的是两段时间的间隔,而题目要求的是第二段时间减去第一段时间,第二个代码是正解

#include<bits/stdc++.h>

using namespace std;

int h,m,s,n,ht,mt,st,nt;

int main()
{
	scanf("%d:%d:%d",&h,&m,&s);
	scanf("%d:%d:%d",&ht,&mt,&st);
	while(1){
		s--;
		n++;
		if(s==-1){
			s=59;
			m--;
			if(m==-1){
				m=59;
				h--;
				if(h==-1){
					h=23;
				}
			}
		}
		if(h==ht&&m==mt&&s==st)break;
	}
	int day=24*60*60;
	if(n>day/2)n=day-n;
	cout<<n;
	return 0;
}

这是正解:

#include<bits/stdc++.h>

using namespace std;

int h,m,s,n,ht,mt,st,nt;

int main()
{
   scanf("%d:%d:%d",&ht,&mt,&st);
	scanf("%d:%d:%d",&h,&m,&s);
	while(1){
		s--;
		n++;
		if(s==-1){
			s=59;
			m--;
			if(m==-1){
				m=59;
				h--;
				if(h==-1){
					h=23;
				}
			}
		}
		if(h==ht&&m==mt&&s==st)break;
	}
	cout<<n;
	return 0;
}
posted @ 2022-11-17 23:04  林动  阅读(137)  评论(0)    收藏  举报