题目链接:
A题:
题意:
q次查询,给你一个n,要你用1和2来凑出n,1的花费为a,2的花费为b,求花费的最小值。
思路:
我们知道当2*a<=b时全用1来肯定是最优的,当2*a>b时,若n为奇数就是1个1其他全是2,若n为偶数就全都是2这样是最优的。
代码实现如下:
1 #include 2 #include
View Code
B题:
题意:
给你n个数,要你去掉一个数,然后剩余的n-1个数保持相对顺序不变,问有多少种方案使得剩下的数中奇数项的和等于偶数项的和。
思路:
我们知道去掉一个数后对前面的数的位置的奇偶性不会产生影响,后面的数的位置的奇偶性变为对立的,因此我们只需要求下奇数项和偶数项的前缀和即可。
代码实现如下:
1 #include 2 #include
View Code
C题:
题意:
给你n*n个数要你构建一个每行每列都是回文的矩阵。
思路:
模拟即可。
代码实现如下:
1 #include 2 #include
View Code
D题:
题意:
有n杯咖啡,m页作业,每杯咖啡的权值为ai,假如你某一天喝了k杯咖啡那么你写的作业页数为a1,a2-1,a3-2……这里的1,2,3指当天喝的顺序而非原序列的下标,要你用最少的天数写完作业。
思路:
先将ai从大到小排序,二分天数,然后把所有会产生正贡献的咖啡求和,与m比较即可。
代码实现如下:
1 #include 2 #include
View Code E题:
题意:
给你n和k,要你构建n对数,假设第i对为ai,bi,第j对为aj,bj,需满足一下条件:
- ai!=bi;
- ai==aj与bi==bj不能同时成立;
- 若j==i+1时,ai!=aj且bi!=bj。
思路:
第一个数一直是1~k的循环,第二个数则是2~k~1,3~k~2,4~k~2这样循环,我们知道满足题意的总排列对数只有k*(k-1)种(第一位放置方法有k种选择,第二位也有k种,故总的排列方法是k*k,其中只有1-1,2-2这种是不满足要求的),因此当n>k*(k-1)时输出NO。
代码实现如下:
1 #include 2 using namespace std; 3 int n,k; 4 pair ans[200007]; 5 int main(){ 6 scanf("%d%d",&n,&k); 7 if(n>1LL*k*(k-1)) return puts("NO")*0; 8 int a=2,x=1,y=2; 9 for(int i = 1; i<=n;i++){10 ans[i]={x,y};11 x++,y++;12 if(x>k) x = 1;13 if(y>k) y =1;14 if(y==a) {15 a++;16 if(a>k) a=1;17 y = a;18 }19 }20 puts("YES");21 for(int i =1;i<=n;i++){22 printf("%d %d\n",ans[i].first,ans[i].second);23 }24 return 0;25 }
View Code F1题:
题意:
给你一棵树,每个结点的颜色可以是0,1,2,要你删除一条边使得得到的两个联通块内不能同时出现1和2。
思路:
dfs记一下子树中的1和2的个数与总的1和2的个数比较即可。
代码实现如下:
1 #include 2 #include
G[maxn];45 46 void dfs(int u, int p) {47 if(a[u] == 1) sum1[u]++;48 else if(a[u] == 2) sum2[u]++;49 for(int i = 0; i < (int)G[u].size(); i++) {50 int v = G[u][i];51 if(v == p) continue;52 dfs(v, u);53 if((sum1[v] == num1 && sum2[v] == 0) || (sum2[v] == num2 && sum1[v] == 0)) ans++;54 sum1[u] += sum1[v], sum2[u] += sum2[v];55 }56 }57 58 int main(){59 scanf("%d", &n);60 for(int i = 1; i <= n; i++) {61 scanf("%d", &a[i]);62 if(a[i] == 1) num1++;63 else if(a[i] == 2) num2++;64 }65 for(int i = 1; i < n; i++) {66 scanf("%d%d", &u, &v);67 G[u].push_back(v);68 G[v].push_back(u);69 }70 dfs(1, 0);71 printf("%lld\n", ans);72 return 0;73 }
View Code