• D


     
    Tokitsukaze has a sequence of length nn, denoted by aa.
    Tokitsukaze can merge two consecutive elements of aa as many times as she wants. After each operation, a new element that equals to the sum of the two old elements will replace them, and thus the length of aa will be reduced by 11.
    Tokitsukaze wants to know the maximum possible number of elements that are multiples of pp she can get after doing some operations (or doing nothing) on the sequence aa.
    InputThere are several test cases.

    The first line contains an integer T(1T20)(1≤T≤20), denoting the number of test cases. Then follow all the test cases.
    For each test case, the first line contains two integers nn and p(1n,p105)(1≤n,p≤105), denoting the length of the sequence and the special number, respectively.
    The second line contains nn integers, where the ii-th integer aiai (1ai105)(1≤ai≤105) is the ii-th element of aa.
    It is guaranteed that the sum of nn in all test cases is no larger than 106106.
    OutputFor each test case, output in one line the maximum possible number of elements that are multiples of pp after doing some operations.
    Sample Input

    2
    5 3
    2 1 3 2 1
    3 1
    123 456 789

    Sample Output

    3
    3

    Sponsor

    题意:

      一个序列,每次可以将序列相邻的两个数相加生成一个新的和替代这两个元素,求最终序列里为 p 的倍数的元素最多可能为多少个

    思路:

      前缀和

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<bitset>
    #include<cassert>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<ctime>
    #include<deque>
    #include<iomanip>
    #include<list>
    #include<map>
    #include<queue>
    #include<set>
    #include<stack>
    #include<vector>
    #include <vector>
    #include <iterator>
    #include <utility>
    #include <sstream>
    #include <limits>
    #include <numeric>
    #include <functional>
    using namespace std;
    #define gc getchar()
    #define mem(a) memset(a,0,sizeof(a))
    //#define sort(a,n,int) sort(a,a+n,less<int>())
    
    #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    typedef pair<int,int> pii;
    typedef char ch;
    typedef double db;
    
    const double PI=acos(-1.0);
    const double eps=1e-6;
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+10;
    const int maxm=100+10;
    const int N=2e5+10;
    const int mod=1e9+7;
    
    int n = 0;
    int p = 0;
    int counter[N] = {0};
    int sum[N] = {0};
    int ans[N] = {0};
    int K[N] = {0};
    void init_K()
    {
        for(int i = 0;i<p;i++)
    	{
    	 	K[i] = -1;
    	}
    }
    int main()
    {
        int T;
        cin >> T;
        while(T--)
    	{
            scanf("%d%d",&n ,&p);
            init_K();
            for(int i = 1;i<=n;i++)
    		{
    			int temp = 0;
    			cin >> temp;
            	counter[i] = (counter[i-1] + temp)%p;
            }
            for(int i = 0;i<=n;i++)
    		{
                sum[i] = K[counter[i]];
                K[counter[i]] = i;
            }
            for(int i = 1;i<=n;i++)
    		{
                if(sum[i] != -1)
                {
                    ans[i] = max(ans[i-1] , ans[sum[i]] + 1);
                }
                else 
    			{
    			 	ans[i] = ans[i-1];
    			}
            }
            printf("%d
    ",ans[n]);
        }
        return 0;
    }
    

      

    附第一遍错误思路OT代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<bitset>
    #include<cassert>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<ctime>
    #include<deque>
    #include<iomanip>
    #include<list>
    #include<map>
    #include<queue>
    #include<set>
    #include<stack>
    #include<vector>
    #include <vector>
    #include <iterator>
    #include <utility>
    #include <sstream>
    #include <limits>
    #include <numeric>
    #include <functional>
    using namespace std;
    #define gc getchar()
    #define mem(a) memset(a,0,sizeof(a))
    //#define sort(a,n,int) sort(a,a+n,less<int>())
    
    #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    typedef pair<int,int> pii;
    typedef char ch;
    typedef double db;
    
    const double PI=acos(-1.0);
    const double eps=1e-6;
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+10;
    const int maxm=100+10;
    const int N=2e5+10;
    const int mod=1e9+7;
    
    int counter[100005] = {0};
    void init()
    {
        for(int i = 0;i < 100005;i++)
    		counter[i] = 0;
    }
    int main()
    {
    	int T = 0;
    	int n  = 0, p = 0;
    	int temp = 0;
    	int ans = 0;
    	cin >> T;
    	while(T--)
    	{
    		init();
    		ans = 0;
    		cin >> n >> p;
    		for(int i = 0;i<n;i++)
    		{
    			cin >> temp;
    			counter[temp % p] += 1;
    		}
    		ans += counter[0];
    		for(int i = 1;i <= p/2;i++)
    		{
    			ans += min(counter[i],counter[p-i]);
    		}
    		if(p % 2 == 0)
    		{
    			ans += counter[p/2]/2;
    		}
    		cout << ans << endl;
    	} 
    	return 0;
    }
    

      

    作者:YukiRinLL

    出处:YukiRinLL的博客--https://www.cnblogs.com/SutsuharaYuki/

    您的支持是对博主最大的鼓励,感谢您的认真阅读。

    本文版权归作者所有,欢迎转载,但请保留该声明。

  • 相关阅读:
    01、python数据分析与机器学习实战——python数据分析处理库Pandas
    01、python数据分析与机器学习实战——python数据分析处理库Pandas
    01、python数据分析与机器学习实战——python数据分析处理库Pandas
    从显示一张图片开始学习OpenGL ES
    从显示一张图片开始学习OpenGL ES
    C#中【pdb】文件
    C#中【pdb】文件
    SQLServer 中的存储过程中判断临时表是否存在,存在则删除临时表
    SQLServer 中的存储过程中判断临时表是否存在,存在则删除临时表
    C# 网络编程之webBrowser乱码问题及解决知识
  • 原文地址:https://www.cnblogs.com/SutsuharaYuki/p/13416909.html
Copyright © 2020-2023  润新知