• Codeforces Round #634 (Div. 3)


    A n是奇数输出一半,是偶数输出一半减1

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=200010;
    int t,n;
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		cin>>n;
    		cout<<(n-1)/2<<endl;	
    	}	
    	return 0;
     } 
    

    B 要求任意长度为a的子串都含有b个不同字符,并且a一定大于等于b,那就b个不同字符按顺序排列就可以了

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=200010;
    int t,n,a,b;
    ll ans;
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		cin>>n>>a>>b;
    		for(int i=0;i<n;i++)
    			cout<<(char)(i%b+'a');
    		cout<<endl;
    	}	
    	return 0;
     } 
    

    C 统计相同类型的数量和类型的数量,再判断就行了。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=200010;
    int t,n,a[N],b;
    int num[N];
     
    int main()
    {
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%d",&n);
    		set<int> st;
    		for(int i=1;i<=n;i++) num[i]=0;
    		for(int i=0;i<n;i++)
    		{
    			scanf("%d",a+i);
    			st.insert(a[i]);
    			num[a[i]]++;
    		}
    		int ans=0;
    		for(int i=0;i<n;i++)
    		{
    			if(num[a[i]]>st.size())
    				ans=max(ans,(int)st.size());
    			else//让所有的a[i]站成一队,size就减1了
    				ans=max(ans,min(num[a[i]],(int)st.size()-1));
    		}
    		printf("%d
    ",ans);
    	}	
    	return 0;
     } 
    

    D 已知一个数独,让你改变最多九个数使得数独的每行,每列,每个块都有两个相同的数,数独的每行每列每个块都没有重复的数字,1到9都是只有一个。目的是使每行每列每块都有相同的数字,可以选择九个位置使这九个位置分别位于各行各列各块,将这九个位置的数变一下,不论变为几在它所在的行,列,块都有重复的了。
    块按下面的顺序编号:
    1 2 3
    4 5 6
    7 8 9

    #include<bits/stdc++.h>
    using namespace std;
    int t;
    bool row[10],col[10],block[10];
    char s[10][10];
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		for(int i=1;i<=9;i++) cin>>s[i]+1;
    		memset(row,0,sizeof row);//标记行
    		memset(col,0,sizeof col);//标记列
    		memset(block,0,sizeof block);//标记块
    		for(int i=1;i<=9;i++)
    			for(int j=1;j<=9;j++)
    				if(!row[i]&&!col[j]&&!block[((i-1)/3)*3+((j+2)/3)])
    				{
    					s[i][j]=(s[i][j]-'0')%9+1+'0';
    					row[i]=1;
    					col[j]=1;
    					block[((i-1)/3)*3+((j+2)/3)]=1;
    				}
    		for(int i=1;i<=9;i++)
    			cout<<s[i]+1<<endl;
    	}
    }
    

    再贴一个大佬的思路,每个1(其他数也可以)一定是位于各行各列各块的,将所有1变为其他数就可以了

    #include<bits/stdc++.h>
    using namespace std;
    int t;
    char s[10][10];
    int main()
    {
    	cin>>t;
    	while(t--)
    	{
    		for(int i=1;i<=9;i++) cin>>s[i]+1;
    		for(int i=1;i<=9;i++)
    			for(int j=1;j<=9;j++)
    				if(s[i][j]=='1')
    					s[i][j]='9';
    		for(int i=1;i<=9;i++)
    			cout<<s[i]+1<<endl;
    	}
    }
    

    E1 只会暴力,num[i][j]统计前i个数中j出现的次数,然后就可以用前缀和了
    复杂度(26*n^2)

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2010;
    int t,n,a[N];
    int num[N][30];
    int main()
    {
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%d",&n);
    		for(int i=1;i<=n;i++)
    			for(int j=1;j<=26;j++)
    				num[i][j]=0;
    		int ans=0;
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%d",a+i);
    			for(int j=1;j<=26;j++) num[i][j]=num[i-1][j];
    			num[i][a[i]]++;
    			ans=max(ans,num[i][a[i]]);//x等0的情况
    		}
    		for(int i=1;i<=n;i++)[1,i]是第一个块,都是a[i]
    		{
    			for(int j=n;j>i;j--)//[j,n]是第三个块,也必须都是a[i]
    			{
    				int res=0;
    				for(int k=1;k<=26;k++)//[i+1,j-1]是第二个快,这个块的数不确定,唯一的要求就是数量最多
    					res=max(res,num[j-1][k]-num[i][k]);
    				ans=max(min(num[i][a[i]],num[n][a[i]]-num[j-1][a[i]])*2+res,ans);//取最值
    			}
    		}
    		printf("%d
    ",ans);
    	}	
    	return 0;
     } 
    

    E2还没补,溜了

  • 相关阅读:
    OnFileOpen与OnOpenDocument(转)
    Wpf应用程序进入全屏和退出全屏
    在WPF中使用Emgu加载Image<,>图像的两种方法
    C#中ListBox控件重绘Item项
    sdut2404 Super Prime ACM算法设计
    真彩色制式下IplImage转成CBitmap格式
    【转】中缀表达式转换为后缀表达式
    MFC中CImage的简单复制方法 (Copy CImage)
    齐鲁软件大赛尖峰时刻团队
    Priest John's Busiest Day HDU2491 ACM算法设计
  • 原文地址:https://www.cnblogs.com/neflibata/p/12871754.html
Copyright © 2020-2023  润新知