2020中南大学研究生招生夏令营机试题
第一题:缺失的彩虹
题意
颜色共有七种,给定 n ( n ≤ 100 ) n(n≤100) n(n≤100) 个颜色,问七种颜色中哪些没有出现。
思路
开一个大小为 7 7 7 的数组,分别统计七种颜色出现次数,最后看看哪些出现次数为 0 0 0 即可。
代码
#include "bits/stdc++.h"
using namespace std;
int main() {
int n;
string s;
while(cin>>n) {
vector<int> cnt(7,0);
for(int i=1; i<=n; ++i) {
cin>>s;
if(s[0]=='r') cnt[0]++;
else if(s[0]=='o') cnt[1]++;
else if(s[0]=='y') cnt[2]++;
else if(s[0]=='g') cnt[3]++;
else if(s[0]=='c') cnt[4]++;
else if(s[0]=='b') cnt[5]++;
else if(s[0]=='p') cnt[6]++;
}
vector<char> ans;
for(int i=0; i<7; ++i) if(cnt[i]==0) {
ans.push_back(char('A'+i));
}
cout<<int(ans.size())<<'\n';
for(char p: ans) cout<<p<<'\n';
}
}
第二题:最小价值和
题意
给定 n ( n ≤ 1 e 5 ) n(n≤1e5) n(n≤1e5) 个整数数对 ( a , b ) ( 0 ≤ a , b ≤ 1 e 9 ) (a,b)(0≤a,b≤1e9) (a,b)(0≤a,b≤1e9),有一个长度也为 n n n 的数组。
若将某个数对放在数组的第 i i i 个位置上,则其价值为: a ∗ ( i − 1 ) + b ∗ ( n − i ) a*(i-1)+b*(n-i) a∗(i−1)+b∗(n−i)。
求将这些数对分配在数组上后所有价值之和的最小值。
思路
这是一种常见的考察排序、贪心的题目。
我们需要的就是给这些数对排个序,而排序就得知道两个数对的“大小关系”,因此我们来考察一下两个数对:
令 a 1 , b 1 a_1,b_1 a1,b1 在 i i i 位置, a 2 , b 2 a_2,b_2 a2,b2 在 j j j 位置,不妨假设 i < j i<j i<j,现在我们仅仅考虑这两个数对交换前后分别产生的价值,并且他们是否应该交换位置不会影响其他数对的价值。
若: a 1 ∗ ( i − 1 ) + b 1 ∗ ( n − i ) + a 2 ∗ ( j − 1 ) + b 2 ∗ ( n − j ) > a 1 ∗ ( j − 1 ) + b 1 ∗ ( n − j ) + a 2 ∗ ( i − 1 ) + b 2 ∗ ( n − i ) a_1*(i-1)+b_1*(n-i)+a_2*(j-1)+b_2*(n-j)>a_1*(j-1)+b_1*(n-j)+a_2*(i-1)+b_2*(n-i) a1∗(i−1)+b1∗(n−i)+a2∗(j−1)+b2∗(n−j)>