zoukankan      html  css  js  c++  java
  • 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/

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

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

  • 相关阅读:
    问:Linux下Chrome标题栏中文乱码
    通过printf设置Linux终端输出的颜色和显示方式
    连HTTPS都有漏洞,这么不安全的互联网我们还要继续用吗?
    为什么TCP连接不可靠
    TCP发送接口的返回值
    /proc/uptime详解
    Linux Kernel Version Numbering
    Understanding Linux /proc/cpuinfo
    Android Tips: Best Practices for Using Alpha
    如何让LinearLayout也有类似Button的点击效果?
  • 原文地址:https://www.cnblogs.com/SutsuharaYuki/p/13416909.html
Copyright © 2011-2022 走看看