链接: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; }