标签:操作 printf 接下来 题解 i++ color 链接 tor ems
发布时间: 2017年3月21日 20:00 最后更新: 2017年3月21日 20:01 时间限制: 1000ms 内存限制: 128M
喵哈哈村的月亮同学很无聊,于是太阳同学给月亮同学出了个问题,来打发时间:
有一排硬币,一共N枚,初始时都是正面朝上。接下来会有很多次操作,每次会将其中一段连续的硬币翻一面。求最后硬币的结果。
本题包含多组测试数据。
第一行输入两个数字N,M分别表示硬币的数量和操作的数量。其中0<N<=10000,0<M<=1000.
接下来M行,每行两个整数A,B分别表示本次操作会将第A枚硬币到第B枚硬币翻一面,其中(0<A<=B<=N)
连续输出这N枚硬币的最终结果,其中0表示正面朝上,1表示反面朝上。
10110
题解:数据结构,前缀和
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5+7; int a[maxn]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int A,B; scanf("%d%d",&A,&B); a[A]++; a[B+1]--; } int sum = 0; for(int i=1;i<=n;i++){ sum+=a[i]; if(sum%2==0)printf("0"); else printf("1"); } printf("\n"); }
发布时间: 2017年3月21日 20:00 最后更新: 2017年3月21日 20:01 时间限制: 1000ms 内存限制: 128M
喵哈哈村的月亮同学很无聊,于是太阳同学给月亮同学出了个问题,来打发时间:
有N个村庄,其中已经有M条道路,每条道路连通两个村庄。现在要让全部村庄能够互相到达(不要直接通过一条道路到达,通过其他村庄中转能够达到也可以),请问至少还需要建造多少条道路。
本题包含多组测试数据。
第一行输入两个数字N,M分别表示村庄的数量和道路的数量。其中0<N<=100,0<=M<=100。
村庄编号从1到N。
接下来有M行,每行两个数字A,B分别这条道路连通的两个村庄编号,其中0<A,B<=N,A!=B.
输出一个数字表示至少需要造多少条道路才能把全部村庄连通。
2
题解:图论,dfs
#include<bits/stdc++.h> using namespace std; const int maxn = 105; int n,m; int vis[maxn]; vector<int>E[maxn]; void dfs(int x){ if(vis[x]==1)return; vis[x]=1; for(int i=0;i<E[x].size();i++){ dfs(E[x][i]); } } int main(){ int n,m; while(cin>>n>>m){ memset(vis,0,sizeof(vis)); for(int i=0;i<maxn;i++) E[i].clear(); for(int i=0;i<m;i++){ int a,b; cin>>a>>b; E[a].push_back(b);//整体思想 E[b].push_back(a); }int cnt=0; for(int i=1;i<=n;i++){ if(vis[i]==1)continue; cnt++; dfs(i); } cout<<cnt-1<<endl; } } /*数据:1——2——3 4 5——6 E[1]=2,3 E[2]=1,3 E[3]=1,2 E[5]=6 E[6]=5 vis[1] cnt++ dfs(1) vis[1]=1 dfs(2/*E[1][1]*/)vis[2]=1 dfs(1/*E[2][1]*/) return dfs(3/*E[2][2]*/)vis[3]=1 return dfs(3/*E[1][2]*/)…… /*vis[2] continue vis[3] continue vis[4] cnt++ dfs(4) vis[4]=1 vis[5] cnt++ …… vis[6] continue */
标签:操作 printf 接下来 题解 i++ color 链接 tor ems
原文地址:http://www.cnblogs.com/EdSheeran/p/6601380.html