2019年湘潭大学程序设计竞赛(重现赛)
https://ac.nowcoder.com/acm/contest/893#question
A:签到1
#include<algorithm> #include<cstring> #include<iostream> #include<math.h> #include<string> #include<stdio.h> #include<map> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std; int n1,n2,p1,p2,s1,s2; int main() { while(cin>>n1>>p1>>s1>>n2>>p2>>s2) { if(n1>n2) printf("1\n"); else if(n1<n2) printf("2\n"); else { if(p1<p2) printf("1\n"); else if(p1>p2) printf("2\n"); else { if(s1<s2) printf("1\n"); else if(s1>s2) printf("2\n"); else printf("God\n"); } } } return 0; }
B:签到2
#include<algorithm> #include<cstring> #include<iostream> #include<math.h> #include<string> #include<stdio.h> #include<map> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std; int n; ll a[300005]; int main() { cin>>n; for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=n;i++) { ll x=a[i]; ll cnt=0; while(x>1) { if(x%10==0) x=x/10; else x++; cnt++; } printf("%lld\n",cnt); } return 0; }
C:签到3,打印观察a的值有规律,192的倍数+1,等差求和
#include<algorithm> #include<cstring> #include<iostream> #include<math.h> #include<string> #include<stdio.h> #include<map> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std; int t; ll l,r,n; int main() {/* for(ll i=1;i<=10000;i++) if(i*i*i%192==1) printf("%lld\n",i);*/ scanf("%d",&t); while(t--) { cin>>l>>r; ll sum=0; while(l%192!=1) l++; while(r%192!=1) r--; n=r/192-l/192+1; sum=((l+r)/2)*n; printf("%lld\n",sum) } return 0; }
D:签到4,每次依附到最大的那一堆,结果是:总和-最大
#include<algorithm> #include<cstring> #include<iostream> #include<math.h> #include<string> #include<stdio.h> #include<map> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std; int t,n; int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); ll maxx=-1,sum=0,x; for(int i=0;i<n;i++) { scanf("%lld",&x); sum+=x; maxx=max(maxx,x); } printf("%lld\n",sum-maxx); } return 0; }
F:尺取法,详看注释
#include<algorithm> #include<cstring> #include<iostream> #include<math.h> #include<string> #include<stdio.h> #include<map> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std; int t; int n,m; string s; int main()///尺取法 { scanf("%d",&t); while(t--) { cin>>n>>m; cin>>s; int num,l,r,k,ans;///num表示当前的价值,k表示当前执行了多少次操作 ans=k=num=l=r=0; while(r<n)///算0的价值 { while( (r<n && k<m)||(s[r]=='0') )///有操作机会 或者 当前是0即不需要操作 { if(s[r]=='0') { num++; r++; } else if(s[r]=='1' && k<m) { num++; k++; r++; } ans=max(ans,num); } ///r走不动了,轮到l来走 if(s[l]=='0') { num--; l++; } else { num--; k--;///之前用一次机会把1变成0,现在不要这个1,操作次数要减少 l++; } ans=max(ans,num); } k=num=l=r=0; while(r<n)///算1的价值 { while( (r<n && k<m)||(s[r]=='1') )///有操作机会 或者 当前是0即不需要操作 { if(s[r]=='1') { num++; r++; } else if(s[r]=='0' && k<m) { num++; k++; r++; } ans=max(ans,num); } if(s[l]=='1') { num--; l++; } else { num--; k--;///之前用一次机会把0变成1,现在不要这个0,操作次数要减少 l++; } ans=max(ans,num); } printf("%d\n",ans); } return 0; }