吐槽一下,这次的CF好简单啊。 可是我为什么这么粗心这么大意这么弱。把心沉下来,想想你到底想做什么!
A
题意:O(-1)
思路:O(-1)
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <cstring> 6 using namespace std; 7 8 int main() 9 { 10 string s[100]; 11 int mp[100][100]; 12 int n, m; 13 while(cin >> n >> m) 14 { 15 memset(mp,0,sizeof(mp)); 16 for(int i=0; i<n; i++) 17 cin >> s[i]; 18 for(int i=0; i<n; i++) 19 { 20 int cnt=0; 21 for(int j=0; j<m; j++) 22 if(s[i][j]!='S') cnt++; 23 if(cnt==m) 24 { 25 for(int j=0; j<m; j++) mp[i][j]=1; 26 } 27 } 28 for(int i=0; i<m; i++) 29 { 30 int cnt=0; 31 for(int j=0; j<n; j++) 32 if(s[j][i]!='S') cnt++; 33 if(cnt==n) 34 { 35 for(int j=0; j<n; j++) mp[j][i]=1; 36 } 37 } 38 int sum=0; 39 for(int i=0; i<n; i++) 40 for(int j=0; j<m; j++) 41 if(mp[i][j]) sum++; 42 cout << sum <<endl; 43 } 44 }
B
题意:有n个城市,然后给定m对城市不可建路,一个城市到另一个城市最多经过两条路,问你如何建路。
思路:两个城市之间的距离最多为2说明一条线上最多三个点,且有一点必须再所有三个点的中心。找出一个没有在不可连接的城市的点(因为0<M<N/2).
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <cstring> 6 #include <map> 7 using namespace std; 8 9 const int maxn=10024; 10 int que[2*maxn]; 11 12 int main() 13 { 14 int n, m; 15 while(cin >> n >> m) 16 { 17 map<int,int>mp; 18 int num=0; 19 for(int i=0; i<m; i++) 20 { 21 int u, v; 22 cin >>u >> v; 23 mp[u]=1; 24 mp[v]=1; 25 } 26 int tp; 27 for(int i=1; i<=n; i++) 28 if(!mp[i]) tp=i; 29 cout << n-1 <<endl; 30 for(int i=1; i<=n; i++) 31 { 32 if(i!=tp) cout << i << " " << tp <<endl; 33 } 34 } 35 return 0; 36 }
C
题意:O(-1)
思路:开始想复杂了,想成n皇后问题。其实这题想想也就很水的一题,对每行分析,每行能找出一个空点就是可行解,如果有一行找不到,就对每列找,每列能找到一个空点就是可行解。很水的一题,开始写成了N皇后问题,然后再源代码上改的,最后挂了,悲剧,为什么就懒这一些重新写两个for循环不就好了么,下次不能偷懒了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <cstring> 6 using namespace std; 7 8 const int maxn=1100; 9 int a[maxn][maxn], b[maxn] 10 string s[110]; 11 12 int main() 13 { 14 int n; 15 while(cin >> n) 16 { 17 for(int i=0; i<n; i++) cin >> s[i]; 18 int top=0, flag=0; 19 for(int i=0; i<n; i++) 20 for(int j=0; j<n; j++) 21 if(s[i][j]=='.') 22 { 23 top++; 24 break; 25 } 26 if(top==n) 27 { 28 flag=1; 29 for(int i=0; i<n; i++) 30 for(int j=0; j<n; j++) 31 if(s[i][j]=='.') 32 { 33 cout << i+1 << " " << j+1 <<endl; 34 break; 35 } 36 } 37 top=0; 38 for(int j=0; j<n; j++) 39 for(int i=0; i<n; i++) 40 if(s[i][j]=='.') 41 { 42 top++; 43 break; 44 } 45 if(top==n&&!flag) 46 { 47 flag=1; 48 for(int j=0; j<n; j++) 49 for(int i=0; i<n; i++) 50 if(s[i][j]=='.') 51 { 52 cout << i+1 << " " << j+1 <<endl; 53 break; 54 } 55 } 56 if(!flag) puts("-1"); 57 } 58 return 0; 59 } 60 /* 61 3 62 EEE 63 ... 64 ... 65 */
D:
题意:屌丝从起点S出发去终点E找女神,途中可能会遇见情敌,问屌丝最少能遇见几个情敌。
思路:开始看错了题,以为题目要求最少要遇见一个情敌,然后用了两次广搜,起点和终点分别搜一次。题目木有这么要求啊啊啊啊啊啊啊 O.O O.O O.O。
下次能再给我大意一点么!这题不用想得太复杂,不管这么走,屌丝和情敌都往女神那里走,情敌先到女神那里就一定能遇见屌丝然后干一架,从终点广搜一次就够了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <cstring> 6 #include <queue> 7 using namespace std; 8 9 const int maxn=1024; 10 char map[1024][1024]; 11 long long a[maxn][maxn],visit[maxn][maxn]; 12 int n, m, si, sj, di, dj; 13 int dir[4][2]= {0,1,0,-1,1,0,-1,0}; 14 15 struct node 16 { 17 int x, y; 18 long long time; 19 } f[maxn*maxn]; 20 21 void bfs(int st, int sd) 22 { 23 queue<node>q; 24 memset(visit,0,sizeof(visit)); 25 node s, p; 26 s.x=st, s.y=sd, s.time=0; 27 q.push(s); 28 while(!q.empty()) 29 { 30 p=q.front(); 31 q.pop(); 32 for(int i=0; i<4; i++) 33 { 34 s.x=p.x+dir[i][0]; 35 s.y=p.y+dir[i][1]; 36 s.time=p.time+1; 37 if(1<=s.x&&s.x<=n&&1<=s.y&&s.y<=m&&map[s.x][s.y]!='T'&&!visit[s.x][s.y]) 38 { 39 visit[s.x][s.y]=1; 40 a[s.x][s.y]=s.time; 41 q.push(s); 42 } 43 } 44 } 45 } 46 47 int main() 48 { 49 while(cin >> n >> m) 50 { 51 int num=0; 52 for(int i=1; i<=n; i++) 53 { 54 scanf("%s",map[i]+1); 55 for(int j=1; j<=m; j++) 56 { 57 if(map[i][j]=='S') si=i, sj=j; 58 else if(map[i][j]=='E') di=i, dj=j; 59 else if('0'<map[i][j]&&map[i][j]<='9') 60 { 61 f[num].x=i; 62 f[num].y=j; 63 num++; 64 } 65 } 66 } 67 memset(a,0,sizeof(a)); 68 bfs(di,dj); 69 long long sum=0; 70 for(int i=0; i<num; i++) 71 { 72 int x=f[i].x, y=f[i].y; 73 if(a[x][y]<=a[si][sj]&&a[x][y]) sum+=map[x][y]-'0'; 74 } 75 cout << sum <<endl; 76 } 77 return 0; 78 }
E:
不会。