A:https://ac.nowcoder.com/acm/contest/7329/A
题意:初始时间是12:00,问你t分钟之后时针和分针的较小夹角的度数,需要将答案四舍五入到整数。
思路:题目已经告诉我们时针和分针每分钟转多少度了。那么我们可以计算分针和时针在t分钟后的位置。然后输出答案就可以了。时针角度就可以直接算,分针由于每小时重置一次的缘故,把t%60就可以了。
//team yglance+xhwl+TTD #include<bits/stdc++.h> typedef long long ll; const ll mod=1e9+7; const ll maxn=1e5+7; const double pi=acos(-1); using namespace std; int main() { ios::sync_with_stdio(false); //freopen("in.in","r",stdin); //freopen("out.out","w",stdout); int n; cin>>n; while(n--) { int t; cin>>t; { int h,m; m=0; m+=t%60; double a; double b; a=0.5*t;//时针角度 b=m*6;//分针角度 //cout<<"t="<<t<<" "<<a<<" "<<b<<" "; if(t&1) { cout<<min(max(a,b)-min(a,b),360.0-(max(a,b)-min(a,b)))+0.5<<endl; } else { cout<<min(max(a,b)-min(a,b),360.0-(max(a,b)-min(a,b)))<<endl; } } } return 0; }
B:https://ac.nowcoder.com/acm/contest/7329/B
题意:给你一个长度为n的序列,再给你x,y。叫你把这个序列分成1~ x段(具体段数记作i),每次又要记录下每一段中的最大的前1~ i个数(记作j)。之后计算这些“最大值”的总和,然后叫你求总和的最大值。
思路:首先要明白对于每个(i,j),我们的划分是不一样的,这个可以在样例中看出来。下一步我们来想,我们想要总和最大,那么就应该是这个序列最大的那些数的总和,为什么这么说,因为对于每个(i,j)我们都可以进行对应的划分,使得这些划分中要取得数恰是原序列的那些最大值。
例:
5
1 5 2 4 3
2 2
val(1,1)=5 ,分割成 [1 5 2 4 3],最大的数是 5
val(1,2)=11,分割成 [1 5 2 4 3],最大的两个数是 5 和 4
val(2,1)=11,分割成 [1 5][2 4 3],两组中各自最大的数是 5 和 4
val(2,2)=19,分割成 [1 5 2][4 3],两组中各自最大的两个数是 5 2 和 4 3
故答案为5+9+9+14=37
这个例子是觉得自己讲的太烂了。有助于别人理解。
至此代码也就出来了
//team yglance+xhwl+TTD #include<bits/stdc++.h> typedef long long ll; const ll mod=1e9+7; const ll maxn=1e5+7; const double pi=acos(-1); using namespace std; //对于I=1,答案一定是sort ll a[maxn]; ll ans=0; ll x,y,n; ll sum[maxn]; int main() { ios::sync_with_stdio(false); //freopen("in.in","r",stdin); //freopen("out.out","w",stdout); cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n,greater<ll>()); cin>>x>>y; // for(int i=0;i<n;i++) // { // cout<<a[i]<<" "; // } // cout<<endl; sum[0]=a[0]; for(int i=1;i<n;i++) { sum[i]=sum[i-1]+a[i]; } // for(int i=0;i<n;i++) // { // cout<<sum[i]<<" "; // } // cout<<endl; for(int i=1;i<=x;i++) { for(int j=1;j<=y;j++) { ans+=sum[i*j-1]; } } cout<<ans<<endl; return 0; }
写在最后:
玩了半年吧,今年和明年也没机会了,还没开始就结束了。
尽人事听天命!