• ACM程序设计选修课——1043: Radical loves integer sequences(YY)


    1043: Radical loves integer sequences

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 36  Solved: 4
    [Submit][Status][Web Board]

    Description

    One day Radical got hold of an integer sequence a1, a2, ..., an of length n. He decided to analyze the sequence. For that, he needs to find all values of x, for which these conditions hold:
    x occurs in sequence a.
    Consider all positions of numbers x in the sequence a (such i, that ai = x). These numbers, sorted in the increasing order, must form an arithmetic progression.
    Help Radical, find all x that meet the problem conditions.

     

     

    Input

    The first line contains integer n (1 ≤ n ≤ 105). The next line contains integers a1a2...an (1 ≤ ai ≤ 105). The numbers are separated by spaces.

     

    Output

    In the first line print integer t — the number of valid x. On each of the next t lines print two integers x and px, where x is current suitable value, px is the common difference between numbers in the progression (if x occurs exactly once in the sequence, px must equal 0). 
    Print the pairs in the order of increasing x.

     

    Sample Input

    1
    3
    4
    9 9 3 5
    

    Sample Output

    1
    3 0
    3
    3 0
    5 0
    9 1

    这题前几次看真心没看懂,今天下午看了一下,发现是判断同一个数字出现的下标是否是等差数列,是则输出公差,否则则不输出。

    没什么算法,就是记录时判断麻烦点..

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<sstream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<deque>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<map>
    bool ok[100009];
    int mop[100009];
    int step[100009];
    int pos[100009];
    using namespace std;
    int main (void)
    {
    	int t,i,j,n,tstep,cnt;
    	while (~scanf("%d",&n))
    	{
    		memset(ok,0,sizeof(ok));//判断改数是否存在等差数列
    		memset(mop,0,sizeof(mop));//记录该数的出现次数
    		memset(step,0,sizeof(step));//记录该数的公差
    		memset(pos,0,sizeof(pos));//记录该数的每(前)一次出现的下标pos
    		tstep=0;
    		cnt=0;
    		for (i=1; i<=n; i++)
    		{
    			scanf("%d",&t);
    			mop[t]++;
    			if(mop[t]>=1)//若出现过
    			{				
    				if(mop[t]==1)//若此时只有一次
    				{
    					ok[t]=1;//暂时可行
    					cnt++;//暂时可行数+1
    					pos[t]=i;//此时为第一次出现的位置
    					step[t]=0;//此时公差为0
    				}
    				else if(mop[t]==2)//两次
    				{					
    					step[t]=i-pos[t];//公差Δd
    					pos[t]=i;//位置更变
    					ok[t]=1;//暂时可行
    				}
    				else//三次以上
    				{					
    					tstep=i-pos[t];//临时公差
    					if(tstep!=step[t])//若不等于此前的公差,则
    					{
    						if(ok[t])//若此前没有被减掉
    							cnt--;//减掉该数
    						ok[t]=0;//变为不可行						
    					}
    					pos[t]=i;//位置变更	
    				}
    			}
    		}
    		printf("%d
    ",cnt);
    		for (i=1; i<=100000; i++)
    		{
    			if(ok[i])
    			{
    				if(mop[i]==1)
    				{
    					printf("%d %d
    ",i,0);
    				}
    				else
    				{
    					printf("%d %d
    ",i,step[i]);
    				}
    			}
    		}
    	}	
    	return 0;
    }
  • 相关阅读:
    雨课堂知识点总结(六)
    软件构造雨课堂知识点总结(五)
    软件构造雨课堂知识点总结(四)
    软件构造雨课堂知识点总结(三)
    0-N-0计数的优化写法
    Nginx TP5环境配置
    小程序跳转H5及其他页面
    mysql中varchar类型和datetime类型字段进行比较
    微信小程序开发者工具更新后报很多错误
    php后台解决跨域
  • 原文地址:https://www.cnblogs.com/Blackops/p/5356393.html
Copyright © 2020-2023  润新知