10.1综合强化刷题 Day3 morning

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10.1综合强化刷题 Day3 morning相关的知识,希望对你有一定的参考价值。

                        竞赛时间:??????????:??-??:??

 

 

题目名称

a

b

c

名称

a

b

c

输入

a.in

b.in

c.in

输出

a.out

b.out

c.out

每个测试点时限

1s

1s

1s

内存限制

256MB

256MB

256MB

测试点数目

10

10

10

每个测试点分值

10

10

10

是否有部分分

题目类型

传统

传统

传统

 

 

a

【问题描述】

你是能看到第一题的 friends 呢。

——hja

怎么快速记单词呢?也许把单词分类再记单词是个不错的选择。何大爷给出了一种分单词的方法,何大爷认为两个单词是同一类的当这两个单词的各个字母的个数是一样的,如 dog  god。现在何大爷给了你 N个单词,问这里总共有多少类单词。

【输入格式】

第一行一个整数N代表单词的个数。接下来N行每行一个单词。

【输出格式】

一行一个整数代表答案。

【样例输入】

3

AABAC

CBAAA

AAABB

【样例输出】

2

技术分享

 本来打的是个70分的暴力,结果后面两个点A了,第8个点T了、、准是看本姑娘太可爱了、、

将近n^2枚举,判断一个字符是否与另一个字母相同,在比较的时候挨个字母的个数进行比较

技术分享
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 10010
using namespace std;
bool flag;
char ch[N][110];
int n,l[N],ans,sum[N][30],fa[N];
int find(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x*f;
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    n=read();ans=n;
    for(int i=1;i<=n;i++) cin>>ch[i],l[i]=strlen(ch[i]);
//    sort()
    for(int i=1;i<=n;i++)
     for(int j=0;j<l[i];j++)
      sum[i][ch[i][j]-A]++;
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=n;i++)
     for(int j=i+1;j<=n;j++)
     { 
        flag=false;
        for(int k=0;k<26;k++)
         if(sum[i][k]!=sum[j][k]) {flag=true; break;}
        if(!flag) 
         if(find(i)!=find(j)) fa[j]=i,ans--;
     } 
    printf("%d",ans);
    return 0;
}
考场90分代码

 

AC代码

将字符串转换成数字进行比较(在转换的时候我们要乘一个质数,乘质数重复的可能性很小),sort排序以后判断当前数是否与他后面的数相同,如果不同ans++

技术分享
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 10010
using namespace std;
char ch[110];
int n,l[N],ans,num[N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x*f;
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++) 
    {
        cin>>ch,l[i]=strlen(ch);
        sort(ch,ch+l[i]);
        for(int j=0;j<l[i];j++)
         num[i]=num[i]*233+ch[j]-A+1;
    }
    sort(num+1,num+1+n);
    for(int i=1;i<n;i++)
     if(num[i]!=num[i+1]) ans++;
    printf("%d",ans+1);
    return 0;
}
AC代码

 

 

b

【问题描述】

你是能看到第二题的 friends 呢。

——laekov

长度为n 的铁丝,你可以将其分成若干段,并把每段都折成一个三角形。你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法。

【输入格式】

一行一个整数n

【输出格式】

一行一个整数代表答案对109 + 7取模之后的值。

【样例输入 1

6

【样例输出 1】

2

【样例输入 2】

9

【样例输出 2】

6

【样例解释 2】

(1,1,1), (2,2,2); (2,2,2), (1,1,1)算两种方案。

技术分享

 

 

 

 

 

 

c

【问题描述】

你是能看到第三题的 friends 呢。

——aoao

在小学的时候,我们都学过正视图和左视图。现在何大爷用一些小方块摆了一个图形,并给出了你这个图形的左视图和正视图。现在何大爷希望知道,在给定正视图和左视图的情况下,原来的立体图形有多少种可能的情况?

【输入格式】

第一行两个整数N ,M ,代表在左视图和正视图中分别有多少列。

第二行N个整数,代表在左视图中从左至右每一列的高度。

第三行M个整数,代表在正视图中从左至有每一列的高度。

【输出格式】

一行一个整数代表答案对109 + 9取模之后的值。

【样例输入 1】

2 2

1 1

1 1

【样例输出 1】

7

【样例输入 2】

4 5 

5 2 4 1

5 2 4 0 1 

【样例输出 2】 

429287 

技术分享

 

 

 

 

              技术分享

 

                      距 NOIp2017 还剩 28 天

                                你可以做的事情还有很多,即使到最后一秒也不要放弃,因为不到结束的那一刻谁也不知道结果会怎样。

以上是关于10.1综合强化刷题 Day3 morning的主要内容,如果未能解决你的问题,请参考以下文章

10.1综合强化刷题 Day3 afternoon

10.1综合强化刷题 Day4

10.1综合强化刷题 Day5

10.1综合强化刷题 Day6

10.1综合强化刷题 Day2 afternoon

清北刷题班day3 morning