Codeforces AIM Tech Round3

打得最烂一场Codeforces,多次都错题,无限WA。。。

A题:

题意:给定n个橘子的大小,大小超过b的丢掉,不足d的补充进来,同时超过d的部分去掉,问要去掉几次

分析:直接模拟即可

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int maxn=100020;
15 int a[maxn];
16 int n,b,d;
17 int main()
18 {
19     while(cin>>n>>b>>d)
20     {
21         for(int i=0;i<n;i++)
22             scanf("%d",&a[i]);
23         vector<int> que;
24         for(int i=0;i<n;i++)
25         {
26             if(a[i]<=b)
27                 que.push_back(a[i]);
28         }
29         queue<int> q;
30         while(!q.empty())
31             q.pop();
32         int cnt=0;
33         for(int i=0;i<que.size();i++)
34         {
35             int t=que[i];
36             q.push(t);
37         }
38         while(!q.empty())
39         {
40             int h=q.front();
41             q.pop();
42             while(h<=d)
43             {
44                 if(q.empty()) break;
45                 int f=q.front();
46                 q.pop();
47                 h+=f;
48                 if(h>d)
49                 {
50                     cnt++;
51                     break;
52                 }
53             }
54         }
55         cout<<cnt<<endl;
56     }
57     return 0;
58 }
View Code

B题:

题意:给定n个点的坐标,同时给定一个点的坐标,求这个点到达其中n-1个点的最短路径

分析:因为必将到达a[n-1]或者a[0],所以我们先将n个点的坐标进行排序,然后比较覆盖a[n-1]和a[0]的所有情况下的最小值,注意n=1的时候结果为0

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int maxn=100010;
15 int a[maxn];
16 int n,d;
17 int main()
18 {
19     while(cin>>n>>d)
20     {
21         for(int i=0;i<n;i++)
22             scanf("%d",&a[i]);
23         if(n==1){
24             cout<<"0"<<endl;
25             continue;
26         }
27         sort(a,a+n);
28         int h=1<<30;
29         int cnt=1<<30;
30         if(d<=a[0])
31         {
32             cout<<abs(a[n-2]-d)<<endl;
33             continue;
34         }else if(a[n-1]<=d)
35         {
36             cout<<abs(a[1]-d)<<endl;
37             continue;
38         }
39         if(d>=a[0]&&d<=a[1])
40         {
41             h=abs(a[n-1]-d);
42         }
43         if(d<=a[n-1]&&d>=a[n-2])
44         {
45             h=min(h,abs(a[0]-d));
46         }
47         cnt=min(cnt,2*(abs(a[0]-d))+abs(a[n-2]-d));
48         cnt=min(cnt,2*(abs(a[n-2]-d))+abs(a[0]-d));
49         cnt=min(cnt,2*(abs(a[n-1]-d))+abs(a[1]-d));
50         cnt=min(cnt,2*(abs(a[1]-d))+abs(a[n-1]-d));
51         cout<<min(h,cnt)<<endl;
52     }
53     return 0;
54 }
View Code

C题:

题意:给定一个字符串,然后对于其中的一个子串进行如下变化,每个字母变成它的前一个字母,a变成z,求变化以后字典序最小

分析:开始不理解字典序,后来知道就是让排在前面的数尽量小。这样就可以贪心,对于排在尽量靠前不含有a的子串进行变化,若全是a,则将最后一个a变成z即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 string s;
15 int main()
16 {
17     while(cin>>s)
18     {
19         int n=s.length();
20         int flag=0;
21         for(int i=0;i<n;i++)
22         {
23             if(s[i]!='a')
24             {
25                 flag=1;
26                 s[i]=s[i]-1;
27             }else if(s[i]=='a'&&flag)
28             {
29                 break;
30             }
31         }
32         if(flag)
33         {
34             for(int i=0;i<n;i++)
35                 printf("%c",s[i]);
36         }else{
37             for(int i=0;i<n-1;i++)
38                 printf("%c",s[i]);
39             printf("z");
40         }    
41         printf("\n");
42     }
43     return 0;
44 }
View Code

 

posted @ 2016-08-26 07:46  wolf940509  阅读(181)  评论(0编辑  收藏  举报