A题,一个简单的bfs
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #define maxn 100009 using namespace std; int vis[maxn]; vector<int>ve[maxn]; queue<int>q; bool bfs(int s) { int l; vis[s]=1; q.push(s); while(!q.empty()) { int v=q.front(); q.pop(); l=ve[v].size(); for(int i=0; i<l; i++) { int u=ve[v][i]; if(vis[u]==0) { q.push(u); vis[u]=vis[v]+1; } else if(vis[u]==vis[v]||vis[u]>vis[v]+1) return 0; } } return 1; } int main() { int n,m,s; int t; int ca=1; scanf("%d",&t); while(t--) { int x,y; memset(vis,0,sizeof vis); scanf("%d%d%d",&n,&m,&s); for(int i=0; i<n; i++)ve[i].clear(); for(int i=0; i<m; i++) { scanf("%d%d",&x,&y); ve[x].push_back(y); ve[y].push_back(x); } while(!q.empty())q.pop(); printf("Case %d: ",ca++); if(bfs(s))puts("NO"); else puts("YES"); } return 0; }
G题,找规律的题;
#include<cstdio> #include<algorithm> #define maxn 104 #include<cstring> using namespace std; int sor[maxn][maxn]; int tar[maxn][maxn]; int cot1[maxn]; int cot2[maxn]; int main() { int n,m; while(scanf("%d%d",&n,&m)&&(n+m)>0) { memset(cot1,0,sizeof cot1); memset(cot2,0,sizeof cot2); for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { scanf("%d",&sor[i][j]); if(sor[i][j]==1)cot1[i]++; } } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { scanf("%d",&tar[i][j]); if(tar[i][j]==1)cot2[i]++; } } bool flag=1; for(int i=0; i<n; i++) { if(cot1[i]+cot2[i]!=m&&cot1[i]!=cot2[i]) flag=0; } int cnt_1=0,cnt_2=0; if(flag) { for(int i=0; i<n; i++) { for(int j=0; j<i; j++) { cnt_1=0,cnt_2=0; for(int k=0; k<m; k++) { if(sor[i][k]==sor[j][k]) cnt_1++; if(tar[i][k]==tar[j][k]) cnt_2++; } if(cnt_1!=cnt_2&&cnt_1+cnt_2!=m) { flag=0; break; } } if(flag==0) break; } } if(flag)puts("Yes"); else puts("No"); } return 0; }
H题,dp
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define maxn 10009 #define mod 9997 using namespace std; long long dp[maxn][2]; int main() { memset(dp,0,sizeof dp); int n; dp[1][0]=1; dp[1][1]=1; dp[2][1]=2; dp[2][0]=2; for(int i=3;i<10009;i++) { dp[i][0]+=dp[i-1][0]+dp[i-1][1]; if(dp[i][0]>mod)dp[i][0]%=mod; dp[i][1]+=dp[i-1][0]-dp[i-2][1]+mod+mod; dp[i][1]+=dp[i-1][1]; if(dp[i][1]>mod)dp[i][1]%=mod; } while(scanf("%d",&n)&&n!=-1) { printf("%lld ",(dp[n][1]+dp[n][0])%mod); } return 0; }
I题,二分
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 200009 #define ll long long using namespace std; int num[maxn]; ll k; int n; bool check(int mid) { int m=n/mid; int ma=0; ll ans=0; for(int i=1; i<=n; i++) { if(!mid)break; ma=max(ma,num[i]); if(i%m==0) { mid--; ans+=ma; ma=0; } } if(ans>k)return 1; else return 0; } int main() { while(scanf("%d%lld",&n,&k)&&n!=-1) { ll cnt=0; for(int i=1; i<=n; i++) { scanf("%d",&num[i]); cnt+=num[i]; } if(cnt<=k) { puts("-1"); continue; } int l=1; int r=n; while(l<r) { int mid=(l+r)/2; if(check(mid))r=mid; else l=mid+1; } printf("%d ",l); } return 0; }