返回顶部

Codeforces Educational Rounds 85 A~C

A:Level Statistics

题意:统计n个游戏数据,p代表游玩次数,c代表通关次数,每次游玩都不一定通关,求这些数据是否合法

题解:1.游玩次数不能小于通关次数   2.游玩次数和通关次数必须单增  3.每次增加的游玩次数不能小于通关次数

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <stack>
 7 #include <queue>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <unordered_set>
12 #include <unordered_map>
13 #define ll long long
14 #define fi first
15 #define se second
16 #define pb push_back
17 #define me memset
18 const int N = 1e6 + 10;
19 const int mod = 1e9 + 7;
20 using namespace std;
21 typedef pair<int,int> PII;
22 typedef pair<long,long> PLL;
23 
24 int t;
25 int n;
26 int p,c,mp=0,mc=0,tp=0,tc=0;
27 
28 int main() {
29     ios::sync_with_stdio(false);
30     cin>>t;
31     while(t--){
32         tp=0,tc=0;
33         bool flag=1;
34         cin>>n;
35         for(int i=0;i<n;++i){
36             cin>>p>>c;
37             if(i==0) tp=p,tc=c;
38             if(p<tp || c<tc || (p==tp && c>tc) || p<c || (p-tp<c-tc)){
39                 flag=0;
40             }
41             tp=p;
42             tc=c;
43         }
44         if(flag==0) printf("NO\n");
45         else printf("YES\n");
46     }
47 
48     return 0;
49 }
View Code

 

B. Middle Class

题意:定义每人拥有的钱不小于x时为富人,现在有n个人,可以选(1<=x<=n)个人出来将他们的财产平分给所有人,求最多能有多少富人

题解:对每个人拥有的钱排个序,然后贪心,从最有钱的人开始往前遍历,记录一个最大值即可

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <stack>
 7 #include <queue>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <unordered_set>
12 #include <unordered_map>
13 #define ll long long
14 #define fi first
15 #define se second
16 #define pb push_back
17 #define me memset
18 const int N = 1e6 + 10;
19 const int mod = 1e9 + 7;
20 using namespace std;
21 typedef pair<int,int> PII;
22 typedef pair<long,long> PLL;
23  
24 int t;
25 int n;
26 long double x,sum[N];
27 int ans=0;
28 long double a[N];
29 int main() {
30     ios::sync_with_stdio(false);
31     cin>>t;
32      while(t--){
33         cin>>n>>x;
34         ans=0;
35          for(int i=0;i<n;++i){
36              cin>>a[i];
37          }
38         sort(a,a+n);
39          for(int i=n-1;i>=0;--i){
40              sum[n-i]=sum[n-i-1]+a[i];
41          }
42         for(int i=1;i<=n;++i){
43             long double tmp=sum[i]/i;
44             if(tmp>=x){
45                 ans=max(ans,i);
46             }
47         }
48         printf("%d\n",ans);
49      }
50  
51  
52  
53     return 0;
54 }
View Code

 

C. Circle of Monsters

题意:有n个怪物围成一个圈,每次攻击可以对怪物造成一点伤害,当第i个怪物扑街后会对后面一个(n的后面是1)怪物造成b[i]点伤害(如果i+1个怪物存活的话),求最少攻击多少次能将怪物全部消灭

题解:枚举每个怪物受到前一个怪物的阵亡伤害,然后按顺序遍历一边求个最小值就行了(建议用scanf和pritnf,容易T)

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <stack>
 7 #include <queue>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <unordered_set>
12 #include <unordered_map>
13 #define ll long long
14 #define fi first
15 #define se second
16 #define pb push_back
17 #define me memset
18 const int N = 1e6 + 10;
19 const int mod = 1e9 + 7;
20 using namespace std;
21 typedef pair<int,int> PII;
22 typedef pair<long,long> PLL;
23  
24 int t;
25 ll n,a[N],b[N],c[N];
26 ll sum;
27 ll ans=1e18+10;
28 int main() {
29     scanf("%d",&t);
30     while(t--){
31         scanf("%lld",&n);
32         ans=1e18+10;
33         sum=0;
34         for(int i=1;i<=n;++i){
35             scanf("%lld %lld",&a[i],&b[i]);
36             if(i>1) c[i]=max((ll)0,a[i]-b[i-1]);
37         }
38         c[1]=max((ll)0,a[1]-b[n]);
39         if(n==1){
40             printf("%lld\n",a[1]);
41             continue;
42         }
43         for(int i=1;i<=n;++i){
44            sum+=c[i];
45         }
46         for(int i=1;i<=n;++i){
47             ans=min(ans,a[i]+sum-c[i]);
48         }
49         printf("%lld\n",ans);
50     }
51  
52     return 0;
53 }
View Code

 

posted @ 2020-04-12 16:09  Rayotaku  阅读(131)  评论(0编辑  收藏  举报