题解)
- <font color=red>第五届太原理工大学新生赛(决赛)
- :star:A.810975
- :star2:<font color=green>题意
- :cherries:<font color=red>解决思路
- :pear:代码
- :star:<font color=pink>B.hammer玩游戏
- :star2:<font color=green>题意
- :cherries:<font color=red>解决思路
- :pear:代码
第五届太原理工大学新生赛(决赛)
⭐️A.810975
🌟题意
就是说n个对战夜吹说他赢了几把,连胜了几把看有没有可能,有就输出yes+方案,没有就输出no
🍒解决思路
分类讨论,想什么时候就是在吹。(题目保证n>=m>=k)
- 当k=0,一局连胜都没有,那么肯定m是0才是对的(一局都没赢,输出n个0),否则就是在吹。
- 当k>0:
(1) 特判:m==k的时候(即是赢的局数和连胜的局数一样多,此时必定有解,输出m个1后输出n-m个0;
(2)m>k的时候:如果n=m=k那么就输出n个1,否则就输出no,因为总共就n局都赢了肯定k也等于n;
n!=m的时候我们可以这样想,两个0可以包住k个1让他与连胜k场分开,那么我们就可以采用先输出k个1,然后输出一个0在输出k个1,所以只要判断有几局没有赢就有几个0,然后判断k倍0的个数是否大于等于1的个数,这样是可以的,否则就不行。
3.输出要注意0如果多了就后面补上就行。
🍐代码
#include<iostream>
using namespace std;
int main()
{int n, m, k; cin >> n >> m >> k;if (k == 0){if (m == 0) {cout << "YES\n";for (int i = 0; i < n; i++)cout << 0;}else cout << "NO\n";}else{if (m == k) {cout << "YES\n";for (int i = 0; i < n; i++){if (i < m)cout << 1; else cout << 0;}}else{if (n == m){if (k != m)cout << "NO\n";else{for (int i = 0; i < n; i++)cout << 1;}}else{int a = n - m, b = m - k;int c = a;int e=k;if (c * k >= b){cout << "YES\n";while (k--)cout << 1;while (b>0){int d = e;cout << 0; a--;while (d--&&b>0) { cout << 1; b--; }}while (a--)cout << 0;}else cout << "NO\n";}}}
}
⭐️B.hammer玩游戏
🌟题意
其中 A
代表进攻, B
代表防御,C
代表蓄力。
如果 Hammer 可以击杀电脑,则输出一个整数,表示 Hammer 能得到的最高得分。
否则结局一定是平局,(不然 Hammer 的透视挂岂不是白买了!)输出 draw
。
🍒解决思路
1.当机器人进攻时我们只能防御;
2.当机器人防御时我们可以蓄力得到高分
3.当机器人蓄力时我们可以蓄力,也可以进攻如果有能量。为了得到最高分,我们就必须在最后机器人蓄力的时候击杀它,否则杀不掉。
综上我们要记遍历录下C最后的位置同时统计C的数量,然后遍历到C最后的位置统计B的数目,如果能量为0,那么杀不掉。
同时特判如果没有C也是杀不掉。
🍐代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{int n;cin>>n;string a;cin>>a;int cnt=0;int ans=-1;int jj=0;for(int i=0;i<n;i++){if(a[i]=='C'){ans=i;cnt++;}}for(int i=0;i<ans;i++){if(a[i]=='B')jj++;}if(cnt+jj-1<=0||ans==-1)cout<<"draw";else cout<<cnt+jj-2;
}