• codeforces#510 Div2


    pre过了三题 后来A题被hack了 B题终测挂了 两题其实都是有一个小细节没有处理好 中间C还因为cinT了一次

    唉本来打的还不错的 还是太菜了 继续加油吧

    A-Benches

    有n张椅子 原来第i张上有ai个人 现在来了m个人

    求最大值的最大和最小的可能

     1 #include <iostream>
     2 #include<algorithm>
     3 #include<stdio.h>
     4 #include<set>
     5 #include<cmath>
     6 #include<cstring>
     7 #include<map>
     8 #include<vector>
     9 #include<queue>
    10 #include<stack>
    11 
    12 using namespace std;
    13 
    14 int n, m;
    15 const int maxn = 105;
    16 int a[maxn];
    17 
    18 int main()
    19 {
    20     while (cin >> n >> m) {
    21         int maxpeo = -1;
    22         for (int i = 0; i < n; i++) {
    23             cin >> a[i];
    24             maxpeo = max(maxpeo, a[i]);
    25         }
    26 
    27         int maxk = maxpeo + m;
    28         int sub = 0;
    29         for (int i = 0; i < n; i++) {
    30             sub += maxpeo - a[i];
    31         }
    32         int mink;
    33         if(sub >= m){
    34             mink = maxpeo;
    35         }
    36         else if ((m - sub) % n == 0) {
    37             mink = (m - sub) / n + maxpeo;
    38         }
    39         else {
    40             mink = (m - sub) / n + 1 + maxpeo;
    41         }
    42 
    43         cout<<mink<<" "<<maxk<<endl;
    44     }
    45 }
    View Code

    B-Vitamins

    有n瓶果汁,每瓶有一个价格 和 可能含有的维生素【最多只有ABC三种维生素】

    现在想要用最少的钱集齐ABC

    本来感觉是dp 写不出 所以先去写了C 后来发现其实贪心就能过

    分类讨论一下 一种是 直接选三个维生素都有的里面价格最小的

    一种是 选两个维生素加缺的里面价格最小的

    一种是 选单个维生素价格最小的之和

    存好含三种的果汁 两种的果汁 含A的果汁【不包括三种都有】含B的含C的

    第一种可能只有一种情况

    第二种可能 枚举 跑一遍

    第三种可能也只有一种情况

    比一下最小值

    需要注意有可能有的数量是0

      1 #include <iostream>
      2 #include<algorithm>
      3 #include<stdio.h>
      4 #include<set>
      5 #include<cmath>
      6 #include<cstring>
      7 #include<map>
      8 #include<vector>
      9 #include<queue>
     10 #include<stack>
     11 
     12 #define inf 0x3f3f3f3f
     13 
     14 using namespace std;
     15 
     16 const int maxn = 1005;
     17 int n;
     18 struct node {
     19     int c;
     20     char vitamin[5];
     21 }juice[maxn];
     22 node a[maxn], b[maxn], c[maxn], three[maxn], two[maxn];
     23 
     24 bool cmp(node a, node b)
     25 {
     26     return a.c < b.c;
     27 }
     28 
     29 int main()
     30 {
     31     while (scanf("%d", &n) != EOF) {
     32         int cnta = 0, cntb = 0, cntc = 0, cntth = 0, cnttwo = 0;
     33         for (int i = 0; i < n; i++) {
     34             scanf("%d %s", &juice[i].c, juice[i].vitamin);
     35             if (strlen(juice[i].vitamin) == 3) {
     36                 three[cntth++] = juice[i];
     37             }
     38             else if (strlen(juice[i].vitamin) == 2) {
     39                 two[cnttwo++] = juice[i];
     40                 for (int j = 0; j < 2; j++) {
     41                     if (juice[i].vitamin[j] == 'A') {
     42                         a[cnta++] = juice[i];
     43                     }
     44                     else if (juice[i].vitamin[j] == 'B') {
     45                         b[cntb++] = juice[i];
     46                     }
     47                     else {
     48                         c[cntc++] = juice[i];
     49                     }
     50                 }
     51             }
     52             else {
     53                 if (juice[i].vitamin[0] == 'A') {
     54                     a[cnta++] = juice[i];
     55                 }
     56                 else if (juice[i].vitamin[0] == 'B') {
     57                     b[cntb++] = juice[i];
     58                 }
     59                 else {
     60                     c[cntc++] = juice[i];
     61                 }
     62             }
     63         }
     64 
     65         if (cntth == 0 && (cnta == 0 || cntb == 0 || cntc == 0)) {
     66             printf("-1
    ");
     67             continue;
     68         }
     69 
     70         sort(three, three + cntth, cmp);
     71         sort(two, two + cnttwo, cmp);
     72         sort(a, a + cnta, cmp);
     73         sort(b, b + cntb, cmp);
     74         sort(c, c + cntc, cmp);
     75 
     76         int ans;
     77         if(cntth == 0){
     78             ans = inf;
     79         }
     80         else{
     81             ans = three[0].c;
     82         }
     83         for (int i = 0; i < cnttwo; i++) {
     84             if (strcmp(two[i].vitamin, "AB") == 0 || strcmp(two[i].vitamin, "BA") == 0) {
     85                 ans = min(ans, two[i].c + c[0].c);
     86             }
     87             else if (strcmp(two[i].vitamin, "AC") == 0 || strcmp(two[i].vitamin, "CA") == 0) {
     88                 ans = min(ans, two[i].c + b[0].c);
     89             }
     90             else {
     91                 ans = min(ans, two[i].c + a[0].c);
     92             }
     93         }
     94         if(cnta != 0 && cntb != 0 && cntc != 0){
     95             ans = min(ans, a[0].c + b[0].c + c[0].c);
     96         }
     97 
     98 
     99         printf("%d
    ", ans);
    100     }
    101 }
    View Code

    C-Array Product

    给一组数列 做n-1次操作

    有两种操作 :第一种将ai和aj相乘结果赋给aj,ai删除

    第二种 将ai位置删除【这种操作最多只能一次】

    其实也是贪心

    首先 所有的0都要合并 然后删去

    负数 如果是奇数个的话 删去绝对值最小的那个

    如果既有0又有奇数个负数 就把这个负数和0合并再删去

    剩下的这些全部照常做第一种操作就好了

      1 #include <iostream>
      2 #include<algorithm>
      3 #include<stdio.h>
      4 #include<set>
      5 #include<cmath>
      6 #include<cstring>
      7 #include<map>
      8 #include<vector>
      9 #include<queue>
     10 #include<stack>
     11 
     12 #define inf 0x3f3f3f3f
     13 
     14 using namespace std;
     15 
     16 int n;
     17 const int maxn = 2e5 + 5;
     18 int a[maxn];
     19 bool vis[maxn];
     20 
     21 int main()
     22 {
     23     //freopen("C:\Users\wyb\Desktop\tmpcode\codeforces\in.txt", "r", stdin);
     24     //freopen("C:\Users\wyb\Desktop\tmpcode\codeforces\out.txt", "w", stdout);
     25     while (scanf("%d", &n) != EOF) {
     26         memset(vis, 1, sizeof(vis));
     27         int cntmin = 0, lastzero = -1, maxminpos, maxmin = -inf, cnt = 0;
     28         for (int i = 1; i <= n; i++) {
     29             scanf("%d", &a[i]);
     30             if (a[i] == 0) {
     31                 if (lastzero == -1) {
     32                     lastzero = i;
     33                 }
     34                 else {
     35                     printf("1 %d %d
    ", lastzero, i);
     36                     //cout << "1 " << lastzero << " " << i << endl;
     37                     vis[lastzero] = false;
     38                     lastzero = i;
     39                     cnt++;
     40                 }
     41             }
     42             if (a[i] < 0) {
     43                 cntmin++;
     44                 if (maxmin < a[i]) {
     45                     maxmin = a[i];
     46                     maxminpos = i;
     47                 }
     48             }
     49         }
     50         if (cntmin % 2 && lastzero != -1) {
     51             if(cnt == n - 1){
     52                 continue;
     53             }
     54             cnt++;
     55             printf("1 %d %d
    ", maxminpos, lastzero);
     56             //cout << "1 " << maxminpos << " " << lastzero << endl;
     57             if(cnt == n - 1){
     58                 continue;
     59             }
     60             cnt++;
     61             printf("2 %d
    ", lastzero);
     62             //cout << "2 " << lastzero << endl;
     63             vis[maxminpos] = vis[lastzero] = false;
     64         }
     65         else if (lastzero != -1) {
     66             if(cnt == n - 1){
     67                 continue;
     68             }
     69             cnt++;
     70             printf("2 %d
    ", lastzero);
     71             //cout << "2 " << lastzero << endl;
     72             vis[lastzero] = false;
     73         }
     74         else if(cntmin % 2){
     75             if(cnt == n - 1){
     76                 continue;
     77             }
     78             cnt++;
     79             printf("2 %d
    ", maxminpos);
     80             //cout<<"2 "<<maxminpos<<endl;
     81             vis[maxminpos] = false;
     82         }
     83 
     84         int last = -1;
     85         for (int i = 1; i <= n; i++) {
     86             if (vis[i]) {
     87                 if (last == -1) {
     88                     last = i;
     89                 }
     90                 else {
     91                     if(cnt == n - 1){
     92                         break;
     93                     }
     94                     cnt++;
     95                     printf("1 %d %d
    ", last, i);
     96                     //cout << "1 " << last << " " << i << endl;
     97                     last = i;
     98                 }
     99             }
    100         }
    101         //cout<<endl;
    102     }
    103 }
    View Code
  • 相关阅读:
    Java序列化与反序列化
    Java中的反射机制
    Java中读文件操作
    Java中写文件操作
    判断单链表是否有环
    Java继承与组合
    Java类初始化
    堆排序
    希尔排序
    插入排序
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9664843.html
Copyright © 2020-2023  润新知