A水题,但是刚开始写的时候,不知道怎么样例过不了,所以就改写了一边,花了10多分钟才a
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=10000+10,maxn=500+100,inf=0x3f3f3f; bool vis[N]; int a[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int p,n; cin>>p>>n; memset(vis,0,sizeof vis); for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++) { a[i]%=p; if(vis[a[i]]) { cout<<i<<endl; return 0; } else vis[a[i]]=1; } cout<<-1<<endl; return 0; }
B也很水,6分钟1a
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=10000+10,maxn=500+100,inf=0x3f3f3f; int a[30]; int main() { ios::sync_with_stdio(false); cin.tie(0); string s; int n; cin>>s>>n; int maxx=0; for(int i=0;i<26;i++) { cin>>a[i]; maxx=max(maxx,a[i]); } int ans=0; for(int i=0;i<s.size();i++) { int te=s[i]-'a'; ans+=a[te]*(i+1); } for(int i=1;i<=n;i++) ans+=maxx*(i+s.size()); cout<<ans<<endl; return 0; }
c题wa了两发,原因是全部递增的情况没有考虑,用一个数组记录递增长度,一个记录断点,枚举断点两段长度就行了
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-4; const int N=100000+10,maxn=500+100,inf=0x3f3f3f; int in[N],q[N],a[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; int cnt=0; for(int i=0;i<n-1;i++) { if(a[i+1]>a[i])in[cnt]++; else q[cnt]=i,cnt++; } q[cnt]=n-1; for(int i=0;i<=cnt;i++) { in[i]++; /* cout<<in[i]<<endl; cout<<q[i]<<endl;*/ } int ans=1; for(int i=0;i<cnt;i++) { if(q[i]>0&&a[q[i]+1]-1>a[q[i]-1])ans=max(ans,in[i]+in[i+1]); else if(in[i+1]>1&&a[q[i]]+1<a[q[i]+2])ans=max(ans,in[i]+in[i+1]); ans=max(ans,in[i]+1); // cout<<ans<<endl; } ans=max(ans,in[cnt]+1); if(ans>n)ans=n; cout<<ans<<endl; return 0; }
D题有点坑,先暴力求出行和列的k次取值(优先队列优化),然后枚举0到k的情况,就是行取i次,列取k-i次,这样的话每列i*q被取出,又有k-i列,所以减去i*(k-i)*q,还要注意数组大小。。。
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-4; const int N=1000+10,maxn=500+100,inf=0x3f3f3f; ll ma[N][N],ro[N*N],co[N*N]; priority_queue<ll>row,col; int main() { ios::sync_with_stdio(false); cin.tie(0); ll n,m,k,p; cin>>n>>m>>k>>p; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>ma[i][j]; for(int i=0;i<n;i++) { ll res=0; for(int j=0;j<m;j++)res+=ma[i][j]; row.push(res); } for(int i=0;i<m;i++) { ll res=0; for(int j=0;j<n;j++)res+=ma[j][i]; col.push(res); } memset(co,0,sizeof co); memset(ro,0,sizeof ro); for(int i=1;i<=k;i++) { ll cnt=row.top(); ro[i]=ro[i-1]+cnt; row.pop(); row.push(cnt-m*p); cnt=col.top(); co[i]=co[i-1]+cnt; col.pop(); col.push(cnt-n*p); } ll ans=-1e18; for(ll i=0;i<=k;i++) ans=max(ans,co[k-i]+ro[i]-1ll*(k-i)*i*p); cout<<ans<<endl; return 0; } /********************* 1 2 2 2 1 3 *********************/