链接:https://codeforces.com/contest/1511

A:
题意:n个数,每个数可能为1,2,3。1代表赞成,2代表反对,3根据目前赞成数和反对数的数量做决定,求最多有多少赞成。
思路:统计1和3的数目。
代码:

while(t--)
    {
    	int n; cin >> n;
    	 int sum = 0;
        for (int i = 0; i < n;i++){
            int x;cin >> x;
            if(x!=2)
                sum++;
        }
        cout << sum << endl;
	}

B:
题意:有三个数a,b,c,c=min(a,b)。求x,y,其中x有a位数,y有b位数,gcd(x,y)有c位数。
思路:直接求出小的a位数x,最小的b位数y+最小的c位数为最终的y。因为c=min(a,b),假如a<b,那y首先就是x的b-a倍,再加上最小的c位数后,即加上x,那他们的最大公约数就是x,例如a=2,b=3,x=100,y=1100。
注意:慎用pow,别学我偷懒。。。
代码:
int a,b,c;
cin >> a >> b >> c;
int x=pow(10,a-1);
int y=pow(10,b-1)+pow(10,c-1);
cour << x << " " << y << endl;

C:
题意:n个数,q次查询,每次找ai,输出第一个ai的位置后并将它移动到最前面。
思路:总共50个数,数的大小也是1~50,暴力就好,先标记每个数第一次出现的位置在每次输出后直接遍历1~50,如果找的这个数的位置再遍历的数后面,将遍历的数的位置++,遍历完后将这个数移动到最前面,位置更新为1。
代码:
int n,q; cin >> n >> q;
        for(int i=0;i<n;i++) 
        {
        	int x; cin >> x;
        	if(vis[x]==0) vis[x]=i+1;
		}
		for (int i = 1; i <= q;i++){
        int x; cin >> x;
        cout << vis[x]<<" ";
        int tmp = vis[x];
        for (int i = 1; i <= 50;i++){
            if(vis[i]&&vis[i]<tmp)
                vis[i]++;
        }
        vis[x] = 1;
    }
D:
题意:长度为n的字符串s,且每个字符必须满足['a','a'+k]。如果有字符满足si=sj&&s(i+1)=s(j+1),则该字符串会产生代价,输出满足要求的字符串且代价要最小。
思路:直接搜索,用一个二维数组来表示相邻两个字符的出现的个数,将每个字符用数字表示a~z为1~26。每次维护一最小值即可。
代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,k; 
int f[30][30];
void dfs(int num,int x)
{
	if(num==n+1) //长度为n搜满结束
	{
		cout << endl;
		return ;
	}
	ll minn=INF,flag=0;
	for(int i=1;i<=k;i++)
	{
		if(f[x][i]<=minn) //维护代价最小
		{
			minn=f[x][i];
			flag=i;//记录下当前代价最小时的字符
		}
	}
	printf("%c",'a'+flag-1);//输出此时字符
	f[x][flag]++;//将当前相邻两个字符数量加1
	dfs(num+1,flag);//往后搜
	return ;
}
int main()
{
	cin >> n >> k;
	cout << 'a';//随便定义一个出发点
	dfs(2,1); //表示从第2个位置搜,前一个字符是1(即'a')
	return 0;
}