• CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)


    A.MEXanized Array

    AC代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=210;
    6. int a[N];
    7. int n,k,x;
    8. void solve() {
    9. cin>>n>>k>>x;
    10. if(x-1) {
    11. cout<<-1<
    12. return;
    13. }
    14. if(n
    15. cout<<-1<
    16. return;
    17. }
    18. for(int i=0; i
    19. a[i]=i;
    20. }
    21. if(x==k) {
    22. for(int i=k; i
    23. a[i]=k-1;
    24. }
    25. }
    26. else{
    27. for(int i=k;i
    28. a[i]=x;
    29. }
    30. }
    31. // for(int i=0;i
    32. // cout<
    33. int sum=0;
    34. for(int i=0;i
    35. cout<
    36. }
    37. int main() {
    38. int t=1;
    39. cin>>t;
    40. while(t--) {
    41. solve();
    42. }
    43. return 0;
    44. }

    B.Friendly Arrays

    异或==>按位异或,看其二进制每一位

    二进制每一位要么为0,要么为1

    如果要最大的话,我们尽可能让原本为1的继续保持为1,让原本为0的变成1

    如果要最小的话,我们尽可能让原本为0的继续保持为0,让原本为1的变成0

    现在可以让每一个a[i]或上b[j],b[j]可以任意选,由于是或,所以只要某一个b[j]某一位上是1,那么a[1]到a[n]的这一位必定为1,那么最后将a[1]到a[n]异或起来,那么这一位的结果就是n个1异或

    当n为奇数的时候,这一位就为1,那么这一位只会不变或者增大(只有01两种情况),所以我们需要更多的位都能为1,所以或上所有的b[j],因为当b[j]某一位为0时,由于是或,所以对结果没影响,当某一位为1时,那么最后所有a[i]异或得到的结果的该位肯定是1,这样得到的值就是最大的,一个b[j]都不或得到的结果就是最小的

    当n为偶数的时候,这一位为0,那么这一位只会不变或减小,所以如果要求最小值的话,那么就或上所有的b[j],要求最大值的话,那么就一个b[j]或

    由此,最终最大值和最小值只在两种情况中取到,即对于每一个a[i],或上所有的b[j],然后全部的a[i]异或起来和对于每一个a[i],一个b[j]也不或上,然后全部的a[i]异或起来

    AC代码:

    1. #include
    2. #include
    3. #include
    4. #define endl '\n'
    5. using namespace std;
    6. const int N=2e5+10;
    7. int a[N],b[N];
    8. int n,m;
    9. void solve() {
    10. cin>>n>>m;
    11. for(int i=1;i<=n;i++) cin>>a[i];
    12. int tmp=0;
    13. for(int i=1;i<=m;i++){
    14. cin>>b[i];
    15. tmp|=b[i];
    16. }
    17. int x=0,y=0;
    18. for(int i=1;i<=n;i++){
    19. x^=a[i];
    20. y^=(a[i]|tmp);
    21. }
    22. if(x>y) swap(x,y);
    23. cout<' '<
    24. }
    25. int main() {
    26. ios::sync_with_stdio(false);
    27. cin.tie(0);cout.tie(0);
    28. int t=1;
    29. cin>>t;
    30. while(t--) {
    31. solve();
    32. }
    33. return 0;
    34. }

    C.Colorful Table

    可以发现,二维数组b是关于y=x对称的,包含所有数字x的矩形一定是一个正方形

    包含小数字的正方形一定包含大数字的正方形

    只要从大到小枚举颜色,找到它的最小下标以及最大下标,然后以最小下标和最大小标作为一条边组成的正方形即为包含该数字的正方形

    AC代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define endl '\n'
    7. //#define int long long
    8. using namespace std;
    9. int n,k;
    10. void solve() {
    11. cin>>n>>k;
    12. vectorint>>e(k+1);
    13. vector<int>ans(k+1);
    14. for(int i=1;i<=n;i++) {
    15. int x;
    16. cin>>x;
    17. e[x].push_back(i);
    18. }
    19. int t1=2e9,t2=0;
    20. for(int i=k;i>=1;i--){
    21. if(e[i].size()==0) continue;
    22. for(auto v:e[i]){
    23. t1=min(t1,v);
    24. t2=max(t2,v);
    25. }
    26. ans[i]=2*(t2-t1+1);
    27. }
    28. for(int i=1;i<=k;i++) cout<' ';
    29. cout<
    30. }
    31. int main() {
    32. ios::sync_with_stdio(false);
    33. cin.tie(0);
    34. cout.tie(0);
    35. int t=1;
    36. cin>>t;
    37. while(t--) {
    38. solve();
    39. }
    40. return 0;
    41. }

    D.Prefix Purchase

    原本思路:

     

     

    代码: 

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define endl '\n'
    7. //#define int long long
    8. using namespace std;
    9. const int N=2e5+10;
    10. int a[N];
    11. int n,k;
    12. void solve() {
    13. cin>>n;
    14. for(int i=1;i<=n;i++) cin>>a[i];
    15. cin>>k;
    16. int maxn=0;
    17. int maxi=0;
    18. for(int i=1;i<=n;i++){
    19. int x=k/a[i];
    20. if(x>=maxn){
    21. maxn=x;
    22. maxi=i;
    23. }
    24. }
    25. if(k%a[maxi]==0){
    26. for(int i=1;i<=maxi;i++) cout<' ';
    27. for(int i=maxi+1;i<=n;i++) cout<<0<<' ';
    28. cout<
    29. }
    30. else{
    31. int idx=maxi;
    32. for(int i=maxi+1;i<=n;i++){
    33. if(a[maxi]+k%a[maxi]>=a[i]) idx=i;
    34. }
    35. for(int i=1;i<=maxi;i++) cout<' ';
    36. for(int i=maxi+1;i<=idx;i++) cout<<1<<' ';
    37. for(int i=idx+1;i<=n;i++) cout<<0<<' ';
    38. cout<
    39. }
    40. }
    41. int main() {
    42. ios::sync_with_stdio(false);
    43. cin.tie(0);
    44. cout.tie(0);
    45. int t=1;
    46. cin>>t;
    47. while(t--) {
    48. solve();
    49. }
    50. return 0;
    51. }

    发现有一个明显的问题:最后可能分出去的m*a[maxi]+k%a[maxi]中m可能不是1,那么该思路崩盘了

    参考CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!) (A-D)_happychaoss的博客-CSDN博客

    贪心

     AC代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define endl '\n'
    7. #define int long long
    8. using namespace std;
    9. const int N=2e5+10;
    10. int a[N];
    11. int n,k;
    12. void solve() {
    13. cin>>n;
    14. for(int i=1;i<=n;i++) cin>>a[i];
    15. cin>>k;
    16. //维护后缀最小值
    17. for(int i=n-1;i>=1;i--) a[i]=min(a[i],a[i+1]);
    18. vector<int>ans(n+1,0);
    19. ans[1]=k/a[1];
    20. int left=k-ans[1]*a[1];//剩下的硬币的数量
    21. int cnt=k/a[1];//加的次数
    22. for(int i=2;i<=n;i++){
    23. int diff=a[i]-a[i-1];
    24. if(diff==0) ans[i]=ans[i-1];
    25. else{
    26. cnt=min(cnt,left/diff);
    27. left-=cnt*diff;
    28. ans[i]=cnt;
    29. if(cnt==0) break;
    30. }
    31. }
    32. for(int i=1;i<=n;i++) cout<' ';
    33. cout<
    34. }
    35. signed main() {
    36. ios::sync_with_stdio(false);
    37. cin.tie(0);
    38. cout.tie(0);
    39. int t=1;
    40. cin>>t;
    41. while(t--) {
    42. solve();
    43. }
    44. return 0;
    45. }
  • 相关阅读:
    git分支开发管理实践
    【iOS】AutoreleasePool自动释放池的实现原理
    Vue+SpringBoot实现评论功能
    【JAVASE】Java泛型实例化
    mysql主从数据不同步
    Spring Cloud Alibaba 工程搭建
    DEFORMABLE DETR:用于端到端对象检测的可变形Transformer
    3-爬虫-搜索文档树(find和find_all)、bs4其它用法、css选择器、selenium基本使用以及其他、selenium(无头浏览器、搜索标签)
    刨根问底 Redis, 面试过程真好使
    git入门
  • 原文地址:https://blog.csdn.net/m0_74087709/article/details/133166782