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;
}

浙公网安备 33010602011771号