思路: 模拟,用一个 M A X MAX MAX存储。
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; signed main(){ int t; cin>>t; while(t--){ double MA=0; int n; cin>>n; string s; cin>>s; int x=0,y=0; int x1=x; int y1=y; for(int i=0;i E 炸鸡块君的高中回忆 思路: 非常简单的推公式,不能暴力因为数据范围很大。需要特判 n = 1 , m = 1 n=1,m=1 n=1,m=1和 n ! = 1 , m = 1 n!=1,m=1 n!=1,m=1的情况。贪心做法,一直让一个人带着最多 ( m − 1 ) (m-1) (m−1)个人进去,直到所有人全部进入校园。
参考代码:
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; signed main(){ int t; cin>>t; while(t--){ int n,m; cin>>n>>m; if(m==1&&n==1){ cout<<1< J 朋友做游戏 思路: 双指针模拟,贪心。
参考代码:
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; const int N=1e4+10; int a[N],b[N]; bool cmp(int a,int b){ return a>b; } signed main(){ int t; cin>>t; while(t--){ int x,y,n; cin>>x>>y>>n; for(int i=1;i<=x;i++)cin>>a[i]; for(int i=1;i<=y;i++)cin>>b[i]; sort(a+1,a+1+x,cmp); sort(b+1,b+1+y,cmp); for(int i=1;i<=x;i++)a[i]+=a[i-1]; for(int i=1;i<=y;i++)b[i]+=b[i-1]; int ans=-1; for(int i=1;i<=n;i++){ if(i>=1&&i<=x&&n-i<=y&&i>=n-i){ ans=max(ans,a[i]+b[n-i]); } } cout< H 牛牛看云 思路: 本题虽然 n n n很大,具有迷惑性,但是 a a a的范围很小最多只有 1000 1000 1000,所以可以通过记录 0 0 0~ 1000 1000 1000中各个数出现的次数,跑一遍 1 e 6 1e6 1e6的复杂度。当然也可以使用二分来做,时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)。
二分参考代码:
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; const int N=1e6+10; int a[N]; int s[N]; signed main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+1+n); for(int i=1;i<=n;i++){ s[i]=a[i]+s[i-1]; } int res=0; for(int i=1;i<=n;i++){ int x=1000-a[i]; int l=i,r=n; while(l >1; if(a[mid]>=x)r=mid; else l=mid+1; } int sum=l-i; if(l>i) res+=1000*sum-(s[l-1]-s[i-1]+(sum)*a[i]); int sum2=n-l+1; res+=(s[n]-s[l-1]+(sum2)*a[i])-sum2*1000; } cout< 映射+暴力参考代码:
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; const int N=1010; int a[N]; signed main(){ int n; cin>>n; for(int i=1;i<=n;i++){//映射 int x; cin>>x; a[x]++; } int sum=0; for(int i=0;i<=1000;i++)//1e6暴力 for(int j=i;j<=1000;j++){ int dapei=0; if(i==j)dapei=a[i]+(a[i]*(a[i]-1))/2; else dapei=a[i]*a[j]; sum+=dapei*abs(1000-(i+j)); } cout< F 中位数切分 思路: 结论题, 1 1 1个小于 m m m的数需要至少 2 2 2个大于等于 m m m的数来维护, 2 2 2个小于 m m m的数需要至少 3 3 3个大于等于 m m m的数来维护,以此推类,但 0 0 0个小于 m m m的数不需要维护。因为要求最多段,所以一旦遇到小于 m m m的数花最小代价去维护它即可。剩余的不用维护的皆可单独成段。
参考代码:
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; const int N=1e5+10; int a[N]; signed main(){ int t; cin>>t; while(t--){ int n,m; cin>>n>>m; int sum=0;//统计>=m的数量 for(int i=1;i<=n;i++){cin>>a[i];if(a[i]>=m)sum++;} if(n%2==0){ if(sum<=n/2){cout<<"-1"< C Baby’s first attempt on CPU 思路: 阅读理解,模拟+贪心。我们只需要依次执行下来,哪里缺空格补哪里,并且需要考虑补了空格之后对接下去两行的影响。因为我们最多会影响三行。
参考代码:
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; const int N=110; struct node{ int a,b,c; }nodes[N]; signed main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>nodes[i].a>>nodes[i].b>>nodes[i].c; } int res=0; for(int i=1;i<=n;i++){ if(nodes[i].a==1){ res+=3; nodes[i].a=nodes[i].b=nodes[i].c=0; nodes[i+1].b=nodes[i+1].c=0; nodes[i+2].c=0; } else if(nodes[i].b==1){ res+=2; nodes[i].b=nodes[i].c=0; nodes[i+1].c=nodes[i+1].b=0; nodes[i+2].c=0; } else if(nodes[i].c==1){ res+=1; nodes[i].c=0; if(nodes[i+1].b==1){ nodes[i+1].b=0; nodes[i+1].c=1; } else if(nodes[i+1].c==1){ nodes[i+1].c=0; } nodes[i+2].c=0; } } cout< D 牛牛做数论 思路: 比较好看出来的数学题,除了 n n n等于 1 1 1的情况,其余的 n n n的最小 X o Xo Xo为不超过 n n n的所有素数连积,最大 X o Xo Xo为不超过 n n n的最大素数。由于素数的连积小于 1 e 9 1e9 1e9只需要 10 10 10个数所以打表即可。求不超过n的最大素数只需要暴力即可,因为 1 e 9 1e9 1e9内最大两个数的间隔是282。
参考代码:
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; int prime[15]={0,2,3,5,7,11,13,17,19,23,29}; int get_prime(int x){ for(int i=2;i*i<=x;i++){ if(x%i==0)return false; } return true; } signed main(){ int t; cin>>t; while(t--){ int n; cin>>n; if(n==1){ cout<<"-1"< =1;i--){ if(get_prime(i)){ r=i; break; } } cout< A 九小时九个人九扇门 思路: 简单 D P DP DP 01 01 01背包的变形。一个非常有用的结论:任何一个数 m o d 9 mod9 mod9即使其数字根。注意: m o d = 0 mod=0 mod=0的话数字根为 9 9 9,然后 1 e 5 1e5 1e5个人就变成了 1 1 1~ 9 9 9的值,然后进行01背包,选或者不选。然后算出最后的方案数。
参考代码:
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; const int N=1e5+10; const int mod=998244353; int a[N]; int f[N][10]; int get(int x){ if(x%9==0)return 9; else return x%9; } signed main(){//DP int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; a[i]=get(a[i]); } f[0][0]=1;//注意入口,都不选的情况下也是一种方案。 for(int i=1;i<=n;i++){ for(int j=0;j<=9;j++){ f[i][j]=(f[i][j]+f[i-1][j])%mod; int temp=get(j+a[i]); f[i][temp]=(f[i][temp]+f[i-1][j])%mod; } } for(int i=1;i<=9;i++)cout< I B站与各唱各的 思路:
参考代码:
#includeusing namespace std; #define mp make_pair #define int long long #define re register int #define pb emplace_back #define lowbit(x) (x&-x) #define fer(i,a,b) for(re i = a ; i <= b ; i ++) #define der(i,a,b) for(re i = a ; i >= b ; i --) #define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int gcd(int a,int b){return b?gcd(b,a%b):a;} int lcm(int a,int b){return a*b/gcd(a,b);} typedef pair PII; typedef pair PIS; const int mod=1e9+7; int qmi(int a,int b){ int res=1; while(b){ if(b&1)res=(res*a)%mod; a=(a*a)%mod; b>>=1; } return res; } signed main(){ int t; cin>>t; while(t--){ int n,m; cin>>n>>m; int fenzi=qmi(2,n)-2; int fenmu=qmi(2,n); fenmu=qmi(fenmu,mod-2); cout<<(m*fenzi%mod*fenmu%mod)< 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)