牛客网NowCoder Wannafly挑战赛9 A.找一找(数据处理) C.列一列(sscanf)

Posted Persistent.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客网NowCoder Wannafly挑战赛9 A.找一找(数据处理) C.列一列(sscanf)相关的知识,希望对你有一定的参考价值。

好几天没好好学习了(咸鱼晒干了)

把稍微没那么咸鱼的几天前的一场牛客网的比赛稍微看了一下,菜的要死,这一场大数的比较多,都死了。

 

A.找一找

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数

输入描述:

第一行输入一个n
接下来一行输入n个正整数ai

输出描述:

输出符合条件个数
示例1

输入

5
1 2 3 4 5

输出

2

说明

5个数中1和2符合条件,1是后面每个数的因子

这道题如果两个直接比较数组里的数for,会超时,因为数组里可能有相同的数,所以数据处理一下,直接比较一次将数的个数加起来就可以,遍历数据范围那么大小就可以了,暴力。

代码:
 1 //A-这个题将数据压缩一下,可以减少循环次数
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 using namespace std;
 9 const int maxn=1e6+10;
10 const int maxm=1e6;
11 int num[maxn];
12 int main(){
13     int n;
14     while(~scanf("%d",&n)){
15         for(int i=0;i<n;i++){
16             int x;
17             scanf("%d",&x);
18             num[x]++;
19         }
20         int ans=0;
21         for(int i=1;i<=maxm;i++){
22             if(num[i]){
23                 for(int j=i*2;j<=maxm;j+=i){
24                     if(num[j]){
25                         ans+=num[i];break;
26                     }
27                 }
28             }
29         }
30         printf("%d\n",ans);
31     }
32     return 0;
33 }

 

 

 



C.列一列
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An。尽管他计算非常精准,但很快他就弄混了自己的草稿纸,他找出了一些他计算的结果,但他忘记了这些都是数列中的第几项。

输入描述:

每行包括数列中的一项Ak(k<=100000)。

总行数T<=30。

输出描述:

对于每一项Ak,输出一行包括一个正整数k表示输入中数是数列的第几项。

示例1

输入

2
3
5
8
13

输出

2
3
4
5
6

这个题真的是大数了,递推到后面的数就很大了,就超过int的范围了。
我感觉输入的时候要按字符数组输入(试了一下直接输大数ull的不行)
代码,直接unsigned long long的可以,取模的也可以。取模的话有可能模厚的数相同,所以在判断的数上处理一下,因为只有很大的数才会取模之后发生变化,直接判断输入的字符串的长度就可以。
因为感觉sscanf函数有点意思,所以才想写题解。。。
这个题用java写大数也可以,但是我没写
(;′д`)ゞ

代码1:
 1 //C-ull版
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<queue>
 8 #include<stack>
 9 #include<map>
10 using namespace std;
11 typedef unsigned long long ull;
12 const int maxn=1e5;
13 ull a[maxn];
14 void fun(){
15     a[0]=0;a[1]=1;a[2]=2;
16     for(int i=3;i<=maxn;i++)
17         a[i]=a[i-1]+a[i-2];
18 }
19 char s[maxn];
20 int main(){
21     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
22     fun();
23     while(cin>>s){
24         int len=strlen(s);
25         ull n=0;
26         for(int i=0;i<len;i++)
27             n=n*10+s[i]-0;
28         for(int i=1;i<=maxn;i++){
29             if(a[i]==n){
30                 cout<<i<<endl;
31                 break;
32             }
33         }
34     }
35     return 0;
36 }
37 */

 

代码2:

 1 //C-取模版
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 using namespace std;
 9 const int mod=1e9;
10 const int maxn=1e5+10;
11 int a[maxn];
12 void fun(){
13     a[1]=1;a[2]=2;
14     for(int i=3;i<=maxn;i++)
15         a[i]=(a[i-1]+a[i-2])%mod;
16 }
17 char s[maxn];
18 int main(){
19     int n;
20     fun();
21     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
22     while(cin>>s){
23         int len=strlen(s);
24         if(len<10)sscanf(s,"%d",&n);
25         else sscanf(s+(len-9),"%d",&n);
26         for(int i=1;i<=maxn;i++){
27             if(a[i]==n){
28                 cout<<i<<endl;
29                 break;
30             }
31         }
32     }
33     return 0;
34 }

 

 

 

sscanf是个好东西。

溜了。

 

以上是关于牛客网NowCoder Wannafly挑战赛9 A.找一找(数据处理) C.列一列(sscanf)的主要内容,如果未能解决你的问题,请参考以下文章

牛客网 Wannafly挑战赛8 C-小C打比赛 (状压DP)

牛客网Wannafly挑战赛15 B车辆安排(模拟)AND C 出队(规律)

Wannafly挑战赛24-A-石子游戏--思维题

Wannafly挑战赛14C可达性Tarjan缩点

牛客网挑战赛8

NowCoder Wannafly挑战赛23 体验记