A
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <stack>
#include <queue>
#include <set>
#include <cstdlib>
#include <string>
using namespace std;
typedef long long ll;
const int qq = 1e5 + 10;
ll num[qq];
ll n, m, k;
int main(){
cin >> n;
if(n == 1){
cout << 3 << endl;
return 0;
} else if(n == 2){
cout << 4 << endl;
return 0;
}
for(ll i = 1; i <= 1000; ++i){
int ans = i * n + 1;
for(int j = 2; j <= sqrt(ans) + 1; ++j){
if(ans % j == 0){
cout << i << endl;
return 0;
}
}
}
return 0;
}
B
题意:给出n,m 表示每个人拥有的单词数, 然后给出每个人的单词, 现在从第一个人开始每次说一个自己有单词, 不能出现重复的, 谁说不了了就输了
思路: map统计每个人的单词有多少个(去重), 然后统计两个人中相同的单词有多少个, 那么根据最优策略, 每个人肯定是要尽可能多的说出一个对方有点单词, 很显然 如果相同单词是偶数个 那么就平分就可以, 如果是奇数个, 那么第一个就会多说一个单词 , 换衣句话说就是对方少了一个单词. 最后比较两个人剩下单词的大小即可
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <stack>
#include <queue>
#include <set>
#include <cstdlib>
#include <string>
using namespace std;
typedef long long ll;
const int qq = 1e3 + 10;
ll num[qq];
ll n, m, k;
map<string, int> mp1, mp2;
int main(){
cin >> n >> m;
string x;
int a, b, c;
a = b = c = 0;
for(int i = 0; i < n; ++i){
cin >> x;
if(mp1[x] == 1) continue;
mp1[x] = 1;
a++;
}
for(int i = 0; i < m; ++i){
cin >> x;
if(mp2[x] == 1) continue;
if(mp1[x] == 1) c++;
mp2[x] = 1;
b++;
}
if(c % 2 == 1){
a = a - c/2;
b = b - c/2 - 1;
} else {
a = a - c/2;
b = b - c/2;
}
if(a > b) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}
C
题意: n个点, 表示距离结点 i 最远的亲戚是 pi, 求有多少课树
思路:先将一个结点为一棵树的筛出来, 剩下的结点可以直接求联通块的个数, 相加就是答案
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <stack>
#include <queue>
#include <set>
#include <cstdlib>
#include <string>
using namespace std;
typedef long long ll;
const int qq = 1e5 + 10;
ll num[qq];
ll n, m, k;
vector<int> v;
int pre[qq];
int find(int x){
return pre[x] == x ? x: pre[x] = find(pre[x]);
}
int main(){
cin >> n;
int cnt = 0;
for(int i = 1; i <= n; ++i){
cin >> num[i];
if(num[i] == i) {
cnt++;
}
}
for(int i = 0; i <= n; ++i) pre[i] = i;
for(int i = 1; i <= n; ++i){
if(i == num[i]){
pre[i] = -1;
continue;
}
int a = find(i), b = find(num[i]);
if(a != b){
pre[b] = a;
}
}
for(int i = 1; i <= n; ++i)
if(pre[i] == i){
cnt++;
}
cout << cnt << endl;
return 0;
}