给你一个小数让你输出四舍五入后的整数,我直接%.0f输出wa了一个点,用字符串判断过了。。。
给你\(n\)个数组,问你有多少种数组
直接map输出size就好
你需要学习\(n\)个步伐,学习第\(i\)个步伐需要消耗\(t_i\)的时间,并且还要满足必须先学会之前的一些步伐,问你学会第\(n\)个步伐最少需要多长时间
显然倒着跑dfs即可
#include <bits/stdc++.h> using namespace std; #define PII pair<int,int> #define fi first #define se second #define pb push_back #define ll long long #define ull unsigned long long #define PLL pair<ll,ll> const int N=1000010; const int mod=1e9+7; int n; int t[N]; vector<int> a[N]; bool vis[N]; ll res=0; void dfs(int u){ vis[u]=true; for(auto w:a[u]){ if(!vis[w]){ res+=t[w]; dfs(w); } } } int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&t[i]); int k; scanf("%d",&k); for(int j=1;j<=k;++j){ int x; scanf("%d",&x); a[i].pb(x); } } dfs(n); printf("%lld\n",res+t[n]); return 0; }
二维平面上有\(n\)个点,找到最少的点对集,使得任意一点选择某个点对集后加上任意次后能到达其他所有点
\(n\)范围给了\(500\),那么我们直接\(O(n^2)\)枚举,每个点对集进行约分,保证不重复,用map存一下,然后输出size*2即可
#include <bits/stdc++.h> using namespace std; #define PII pair<int,int> #define fi first #define se second #define pb push_back #define ll long long #define ull unsigned long long #define PLL pair<ll,ll> const int N=1000010; const int mod=1e9+7; int n; PII pt[N]; map<PII,int> mp; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d %d",&pt[i].fi,&pt[i].se); } for(int i=1;i<=n;++i){ for(int j=i+1;j<=n;++j){ if(i==j) continue; int x=pt[i].fi-pt[j].fi; int y=pt[i].se-pt[j].se; int d=__gcd(x,y); mp[{x/d,y/d}]++; } } printf("%d\n",(int)mp.size()*2); return 0; }
\(n\)个点,\(m\)条无向边,现在给边赋方向,使得每个点有且仅有一条出边,问你有多少种方案
自己在纸上画几个样例后,不难发现对于每个连通块,只要满足点数刚好等于边数即可
#include <bits/stdc++.h> using namespace std; #define PII pair<int,int> #define fi first #define se second #define pb push_back #define ll long long #define ull unsigned long long #define PLL pair<ll,ll> const int N=1000010; const int mod=998244353; int n,m; vector<int> edge[N]; PII pt[N]; int p[N]; int cnt1[N],cnt2[N]; vector<int> v; int find(int x){ if(p[x]!=x) p[x]=find(p[x]); return p[x]; } int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=m;++i){ scanf("%d %d",&pt[i].fi,&pt[i].se); } for(int i=1;i<=n;++i) p[i]=i; for(int i=1;i<=m;++i){ int fu=find(pt[i].fi); int fv=find(pt[i].se); if(fu!=fv) p[fu]=fv; } for(int i=1;i<=n;++i){ int now=find(i); if(!cnt1[now]) v.pb(now); cnt1[now]++; } for(int i=1;i<=m;++i){ int now=find(pt[i].fi); cnt2[now]++; } bool flag=true; for(auto w:v){ if(cnt1[w]!=cnt2[w]) flag=false; } if(!flag){ puts("0"); return 0; } ll ans=1; for(int i=1;i<=(int)v.size();++i){ ans=ans*1ll*2%mod; } printf("%lld\n",ans); return 0; }