A题
签到题目
B题
细节题目,还有就是我从这个题目学到一个教训:读入字符串请用cin和string 不要用char和scanf 因为这个而造成TLE
C题
我们手推一下会发现在n<=6时 这时候是一定不会出现冲突的
但是在n=7时一定会出现两个点冲突(即只有一种数字的牌而两个点都需要这个数字),那么冲突的结果就是这两个点只能二选一,那么我们朴素的想法就是找一个入度最小的点,然后总边数m减掉它的边数+1就是答案了,但是这个想法很遗憾的WA了。
仔细思考的话原因在于有些边是可以不用删除的,比如2号点和6号点冲突 并且他们是这样连接的话 1--2--5 1--6--3,那么只有1--2 和 1--6是不能同时放点数相同的牌的,只能放一条边。所以这就启发我们只需要找到在两个点冲突时有多少条边是冲突的就可以了。
1 #include <iostream> 2 #include <algorithm> 3 4 int n,m,Min=0x3f3f3f; 5 int vis[23][23]; 6 int main(){ 7 std::cin>>n>>m; 8 for(int i = 1; i <= m; ++i){ 9 int x,y; 10 std::cin>>x>>y; 11 vis[x][y] = vis[y][x] = 1; 12 } 13 if(n <= 6) printf("%d\n",m); 14 else{ 15 for(int i = 1; i <= n; ++i){ 16 for(int j = i+1; j <= n ; ++j){ 17 int Now = 0; 18 for(int k = 1; k <= n; ++k){ 19 if(vis[i][k] && vis[k][j]) Now++; 20 } 21 Min = std::min(Min,Now); 22 } 23 } 24 printf("%d\n",m-Min); 25 } 26 return 0; 27 }
D题
如何让团体中的不相互鄙视呢? 最简单的思考方法就是 如果A会的算法 B都会的话 A与B可以说是相互制衡了,这样的话就不会产生冲突。也就是找出至少两个学习算法一样的人(数字完全一样的人)
再找找看哪些人在当前情况下,可以接受。思考下会发现新来的人必须是 包含于他们的,不能比他们会的算法多,否则还会产生鄙视。
于是思路就有了 先找出至少两个学习算法一样的人,再找出哪些人可以进入这个团队即可。
1 #include <cstdio> 2 #include <map> 3 #include <set> 4 using namespace std; 5 typedef long long ll; 6 7 map<ll,int>Sum; 8 set<int>Out; 9 10 ll ans; 11 ll a[7007],b[7007]; 12 int n; 13 14 int main(){ 15 scanf("%d",&n); 16 for(int i = 1; i <= n; ++i){ 17 scanf("%lld",&a[i]); 18 Sum[a[i]]++; 19 } 20 for(int i = 1; i <= n; ++i){ 21 scanf("%lld",&b[i]); 22 } 23 map<ll, int>::iterator Pos = Sum.begin(); 24 while( Pos != Sum.end() ){ 25 if( (Pos->second) > 1) 26 for(int i = 1; i <= n; ++i){ 27 //printf("Debug\n"); 28 if( (Pos->first | a[i]) == Pos->first) Out.insert(i); 29 } 30 Pos++; 31 } 32 set<int>::iterator sb = Out.begin(); 33 while( sb != Out.end() ){ 34 ans+=b[*sb++]; 35 } 36 printf("%lld\n",ans); 37 return 0; 38 }
E题 F题 难度过大,暂时没有补题的想法~