1.诗
第一行1个字,之后每行字数增加1,输出每行第一列字符。
#include <bits/stdc++.h>
using namespace std;
string s,ans;
int main() {int d,idx;cin>>s;idx=1;d=idx;for(int i=0;i<s.size();i++) {while(d) {if(d==idx) {ans+=s[i];}d--;i++;}idx++;d=idx;i--;}cout<<ans;return 0;
}
2.数组染色
数组排序,当前值+数组长度,然后去掉相同值完后循环。
#include <bits/stdc++.h>
using namespace std;
int T,n;
long long ans;
int main() {cin>>T;while(T--) {cin>>n;vector<int> v(n),s(n+1);for(int i=0;i<n;i++) cin>>v[i];sort(v.begin(),v.end());ans=0;for(int i=0;i<n;i++) {int t=v[i],j=i;while(j<n && v[i]==v[j]) j++;if(t+n-i>ans) ans=t+n-i; i=j-1;}cout<<ans<<endl;}return 0;
}
3.数组询问
求出每个数的所有的质因数然后前缀和,计算缺少长度为k的子数组最大值
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,k,x;
long long a[N],s[N],ans;
bool is_prime(int x) {if(x==1) return 0;if(x==2) return 1;for(int i=2;i<=x/i;i++) {if(x%i==0) return 0;}return 1;
}
int calc(int x){int cnt=0;if(x==1) return cnt;for(int i=1;i<=x/i;i++) {if(x%i==0) {if(is_prime(i)) cnt++;if(x/i!=i) {if(is_prime(x/i)) cnt++;}}}return cnt;
}
int main() {cin>>n>>k;for(int i=0;i<n;i++) {cin>>x;a[i]=calc(x);}for(int i=1;i<=n;i++) {s[i]=s[i-1]+a[i-1];}for(int i=k;i<=n;i++) {int t=s[i]-s[i-k];ans=max(ans,s[n]-t);}cout<<ans;return 0;
}
4.偶数路径
通过52.3%,用一个集合记录当前所包含的所有点,如果这些点的gcd为偶数就答案增加1,同时用一个大集合S把所有这个合法集合加入到里面。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int gcd(int a,int b) {return b?gcd(b,a%b):a;
}
int n,a[N],ans;
int h[N],e[2*N],ne[2*N],idx;
bool st[N];
set<set<int> > S;
void dfs(int u,int fa,int curgcd,set<int>& se) {if(curgcd%2==0 && !S.count(se)) {ans++;S.insert(se);// for(auto x:se) cout<<x<<" ";// puts("");}for(int i=h[u];~i;i=ne[i]) {int j=e[i];if(j!=fa) {int tt=gcd(curgcd,a[j]);if(tt%2) continue;auto ST=se;ST.insert(j);dfs(j,u,tt,ST);}}
}
void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int main() {memset(h,-1,sizeof(h));cin>>n;for(int i=1;i<=n;i++) {cin>>a[i];}int aa,b;for(int i=0;i<n-1;i++) {cin>>aa>>b;add(aa,b);add(b,aa);}for(int i=1;i<=n;i++) {set<int> se;se.insert(i);dfs(i,-1,a[i],se);}cout<<ans;return 0;
}