acm training

线性基https://www.cnblogs.com/vb4896/p/6149022.html

取向量组中的两个向量a,b,把a,b中的某一个替换成a xor b,  替换前后向量组中的向量的线性组合得到的空间相同。 通俗的说就是 替换前后 能异或出来的值一样。

11.12训练题目https://vjudge.net/contest/269827

11.12E let the ballon rise

注意map的应用,mp[s[i]]+=1,这个很巧妙

#include <iostream>
#include<string>
#include<map>
using namespace std;
const int maxn=1005;
int main() {
	int N;
	while(cin>>N&&N)
	{
		
		string s[maxn];
		int n=0;
		map<string,int> mp;
		for(int i=0;i<N;i++)
		{
			cin>>s[i];
			mp[s[i]]+=1;
		}
		int maxv=0;
		for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++)
		{
			if(maxv<it->second)
				maxv=it->second;
		}
		for(map<string,int>::iterator cmp=mp.begin();cmp!=mp.end();cmp++)
		{
			if(cmp->second==maxv)
			{
				cout<<cmp->first<<endl;
				break;
			}
		}
	}
	return 0;
}

11.12D 求最长连续子序列,并找到开始位置和最后位置

注意:如果两个输出结果之间有换行,可先再while循环外定义一个flag=0;然后在while循环中if(flag) cout<<endl; flag++;

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=100010;

int main()
{
	int t=0;
	int n;
	cin>>n;
	while(n--)
	{
        if(t)
            cout<<endl;
        t++;
		int t1;
		cin>>t1;
        int a[maxn];
		for(int  i=1;i<=t1;i++)
		{
			cin>>a[i];
		}
		int manx=a[1],ii=1,jj=1,ans=1;
		for(int j=2;j<=t1;j++)
		{
			if(a[j-1]>=0)
				a[j]=a[j-1]+a[j];
			else
				ans=j;
			if(a[j]>manx)
			{
              manx=a[j];
				ii=ans;
				jj=j;
				
			}
		}
		cout<<"Case "<<t<<":"<<endl;
		cout<<manx<<" "<<ii<<" "<<jj<<endl;
	}
	return 0;
}

11.12E 矩阵快速幂板子

#include<bits/stdc++.h>
using namespace std;
#define mod 7
#define ll long long


int n=2;                                //方阵的行列数
struct Matrix
{
    ll m[105][105];                  //矩阵结构体
};

Matrix operator*(Matrix a,Matrix b)                   //模拟矩阵乘法
{
    Matrix c;
    memset(c.m,0,sizeof(c.m));
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            for(int k=1; k<=n; k++)
                c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]+mod)%mod;
    return c;
}

Matrix operator^(Matrix a,int b)                        //快速幂 矩阵a的b次方
{
    Matrix c;
    memset(c.m,0,sizeof(c.m));
    for(int i=1; i<=n; i++)                            //初始化为单位矩阵
        c.m[i][i]=1;
    while(b)
    {
        if(b&1)
            c=c*a;                                       //快速幂
        a=a*a;
        b>>=1;
    }
    return c;
}

int main()
{
    int a,b,c;
    std::ios::sync_with_stdio(false);
    while(cin>>a>>b>>c)
    {
        if(!a) break;
        if(c<3)
            cout<<1<<endl;
        else
        {
            Matrix M;
            M.m[1][1]=a,M.m[1][2]=b,M.m[2][1]=1,M.m[2][2]=0;
            Matrix ans=M^(c-2);

            cout<<(ans.m[1][1]+ans.m[1][2])%mod<<endl;
        }
    }
    return 0;
}

11.16训练题https://vjudge.net/contest/270251#status

C题(求假币):容易考虑不全面,花了我一天多的时间,能找到不同类型的样例很重要,这样来修改错误

/*Sample Input
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
Sample Output
K is the counterfeit coin and it is light. */
#include <iostream>
#include<string>
#include<map>
using namespace std;
string a="ABCDEFGHIJKL";
map<char,int> ans,cns,bns;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {


        for(int k=0;k<(int)a.length();k++)
        {
            ans[a[k]]=1;
            cns[a[k]]=0;
            bns[a[k]]=0;
        }
        for(int i=0;i<3;i++)
        {

            string s1,s2,s3;
            cin>>s1>>s2>>s3;
            if(s3=="even")
            {
                for(int j=0;j<(int)s1.length();j++)
                {
                    ans[s1[j]]=0;
                    ans[s2[j]]=0;
                }

            }
            else if(s3=="up")
            {
                for(int j=0;j<(int)s1.length();j++)
                {
                    if(ans[s1[j]]==0)
                        j++;
                    else
                    {
                        ans[s1[j]]=1;
                        cns[s1[j]]+=1;
                        bns[s1[j]]+=1;
                    }

                }
                for(int j=0;j<(int)s2.length();j++)
                {
                    if(ans[s2[j]]==0)
                        j++;
                    else
                    {
                         ans[s2[j]]=1;
                        cns[s2[j]]-=1;
                         bns[s2[j]]+=1;
                    }

                }
            }
            else if(s3=="down")
            {
                for(int j=0;j<(int)s1.length();j++)
                {
                    if(ans[s1[j]]==0)
                        j++;
                    else
                    {
                         ans[s1[j]]=1;
                        cns[s1[j]]-=1;
                         bns[s1[j]]+=1;
                    }

                }
                for(int j=0;j<(int)s2.length();j++)
                {
                    if(ans[s2[j]]==0)
                        j++;
                    else
                    {
                         ans[s2[j]]=1;
                        cns[s2[j]]+=1;
                         bns[s2[j]]+=1;
                    }

                }
            }
        }
        int maxx=0;
         for(int t=0;t<(int)a.length();t++)
         {
             if(maxx<bns[a[t]])
                maxx=bns[a[t]];
             
         }
        int m=0-maxx;
        for(int t=0;t<(int)a.length();t++)
        {
            if(ans[a[t]]==1&&cns[a[t]]==m&&maxx==bns[a[t]])
            {
                cout<<a[t]<<" is the counterfeit coin and it is light."<<endl;
                break;
            }

            else if(ans[a[t]]==1&&cns[a[t]]==maxx&&maxx==bns[a[t]])
            {
                cout<<a[t]<<" is the counterfeit coin and it is heavy."<<endl;
                break;
            }
        }



    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/zlppassion/article/details/84023381
ACM