1. 程式人生 > >CodeForces Div2 433

CodeForces Div2 433

spa 技術分享 rac 當前 lap you code 賽後 scanf

A題 Fraction


暴力枚舉 無思維難度 無坑點

技術分享
 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 int n,Mi,Mj;
 5 double Max,now;
 6 int main(){
 7     scanf("%d",&n);
 8     for(int i=1;i<n;i++){
 9         for(int j=1;j<i;j++){
10             //printf("%d %d gcd:%d\n",i,j,__gcd(i,j));
11 if(i+j==n && __gcd(i,j)==1){ 12 double x=i; 13 double y=j; 14 now = y/x; 15 //printf("%.2f\n",now); 16 if(now>Max){ 17 Max = now; 18 Mi = i; 19 Mj = j;
20 } 21 } 22 } 23 } 24 printf("%d %d\n",Mj,Mi); 25 return 0; 26 }
T1

B題 Maxim Buys an Apartment

手寫幾組數據就能發現這是一個結論題目,特判一下特殊情況就OK了。

技術分享
 1 #include <cstdio>
 2 #include <iostream>
 3 typedef long long ll;
 4 ll n,k;
 5 int main(){
6 std::cin>>n>>k; 7 if(n==1){ 8 printf("0 0"); 9 return 0; 10 } 11 if(n==k){ 12 printf("0 0"); 13 return 0; 14 } 15 if(k==0){ 16 printf("0 0"); 17 return 0; 18 } 19 printf("1 "); 20 if(2*k<=n-k){ 21 std::cout<<2*k; 22 } 23 else std::cout<<n-k; 24 return 0; 25 }
T2

C題 Planning

比賽時始終沒有想到這個算法怎麽實現。。。賽後看了下題解,發現還是自己too young
貪心思路:每一秒走能走的最貴的飛機

技術分享
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct p
 5 {
 6     ll x,y;
 7     p(ll x=0,ll y=0):x(x),y(y){}
 8     bool operator <(const p&t)const
 9     {
10         if (x==t.x) return y<t.y;
11         return x>t.x;
12     }
13 };
14 p a[300005];
15 p b[300005];
16 int num[300005];
17 bool use[300005];
18 int main()
19 {
20     ios::sync_with_stdio(false);
21     ll n,k;
22     cin>>n>>k;
23     for(int i=1;i<=n;i++)
24     {
25         cin>>a[i].x;
26         a[i].y=i;
27     }
28 //排序
29     sort(a+1,a+1+n);
30     ll ans=0;
31     int now=1;
32     memset(use,0,sizeof(use));
33     for(int i=1;i<=n;i++)
34         if (!use[i])
35     {
36 //如果當前有和y一樣的次序 就不用加和
37         while(a[now].y>i+k)
38         {
39                 num[a[now].y]=a[now].y;
40                 use[a[now].y-k]=1;
41                 now++;
42         }
43 //對於當前比較大的 我盡量讓差值盡量下就行了,因為i+k是遞增的,所以當前值一定是最優的
44         if (i+k>=a[now].y)
45         {
46             num[a[now].y]=i+k;
47             ans+=a[now].x*(i+k-a[now].y);
48             use[i]=1;
49             now++;
50         }
51     }
52     cout<<ans<<endl;
53     for(int i=1;i<n;i++)
54         cout<<num[i]<<" ";
55     cout<<num[n]<<endl;
56     return 0;
57 }
T3

D題 Jury Meeting

待補

E題

思路:容斥原理+可持久化線段樹

可持久化線段樹不會寫Orz 繼續留坑

CodeForces Div2 433