codeforces #446 892A Greed 892B Wrath 892C Pride 891B Gluttony

A  链接:http://codeforces.com/problemset/problem/892/A

签到

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 long long a,b[100001];
 5 int main() {
 6     int n;
 7     long long sum1=0,sum2=0;
 8     cin>>n;
 9     for(int i=0; i<n; ++i) cin>>a,sum1+=a;
10     for(int i=0; i<n; ++i) cin>>b[i];
11     sort(b,b+n);
12     sum2=b[n-2]+b[n-1];
13     if(sum2>=sum1) cout<<"YES"<<endl;
14     else cout<<"NO"<<endl;
15     return 0;
16 }

B 链接:http://codeforces.com/problemset/problem/892/B

O(n)倒退遍历,保存当前能到的最大长度

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[1000005];
 4 int main() {
 5     ios::sync_with_stdio(false);
 6     int n;
 7     cin>>n;
 8     for(int i=1; i<=n; ++i) cin>>a[i];
 9     int len=-1;
10     for(int i=n; i>=1; --i) {
11         int temp=a[i];
12         if(len>=0) a[i]=-1;
13         len=max(len,temp);
14         len--;
15     }
16     int sum=0;
17     for(int i=1; i<=n; ++i) {
18         if(a[i]!=-1) sum++;
19     }
20     cout<<sum<<endl;
21     return 0;
22 }

 C 链接:http://codeforces.com/problemset/problem/891/A

检测第一次出现1的时候经历了几次操作的最小值,只要出现一次1,那么再加上n-1次操作就可以全部翻转为1

利用gcd(ai)是否等于1可以剪枝,return -1

特别地,要注意全部为1的特殊情况 return 0

代码:

 1 #include <iostream>
 2 using namespace std;
 3 int a[2005];
 4 int GCD(int a, int b) {
 5     if(!b) return a;
 6     return GCD(b,a%b);
 7 }
 8 int main() {
 9     ios::sync_with_stdio(false);
10     cin.tie(0);
11     cout.tie(0);
12     int n,gcd,exist_one=0;
13     cin>>n;
14     cin>>a[1];
15     gcd=a[1];
16     if(a[1]==1) exist_one++;
17     for(int i=2; i<=n; ++i) {
18         cin>>a[i];
19         if(a[i]==1) exist_one++;
20         if(gcd<=a[i]) gcd=GCD(a[i],gcd);
21         else gcd=GCD(gcd,a[i]);
22     }
23     if(gcd!=1) {
24         cout<<"-1"<<endl;
25         return 0;
26     }
27     if(exist_one) {
28         cout<<n-exist_one<<endl;
29         return 0;
30     }
31     int minnum=2005;
32     for(int i=1; i<n; ++i) {
33         gcd=a[i];
34         for(int j=i+1; j<=n; ++j) {
35             if(a[j]>gcd) gcd=GCD(a[j],gcd);
36             else gcd=GCD(gcd,a[j]);
37             if(gcd==1) {
38                 minnum=min(j-i,minnum);
39                 break;
40             }
41         }
42     }
43     cout<<minnum+n-1<<endl;
44     return 0;
45 }

 D 链接:http://codeforces.com/problemset/problem/891/B

让每一个数都能够找到小于自己的最大值,同时假如这个数是最小值,则用最大值来替换它

∵任何两个数(最大、最小除外)的差值都小于最小值与最大值的差值

首先排序,找到对应的值,输出打印

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[25],b[25];
 4 int main() {
 5     ios::sync_with_stdio(false);
 6     int n,minnum=1e9;
 7     cin>>n;
 8     for(int i=0; i<n; ++i) {
 9         cin>>a[i];
10         b[i]=a[i];
11         minnum=min(minnum,a[i]);
12     }
13     sort(a,a+n);
14     int flag=0;
15     for(int i=0; i<=n-1; ++i) {
16         flag=0;
17         if(b[i]==minnum) {
18             flag=1;
19             b[i]=a[n-1];
20             continue;
21         }
22         for(int j=n-1; j>=0; --j) {
23             if(a[j]<b[i]) {
24                 flag=1;
25                 b[i]=a[j];
26                 break;
27             }
28         }
29         if(!flag) {
30             cout<<"-1"<<endl;
31             return 0;
32         }
33     }
34     for(int i=0; i<n-1; ++i) cout<<b[i]<<" ";
35     cout<<b[n-1]<<endl;
36     return 0;
37 }

 

posted @ 2017-11-18 15:49  lemonsbiscuit  阅读(395)  评论(0编辑  收藏  举报