zoukankan      html  css  js  c++  java
  • Test on 12/01/2018

    出了一道原题,我明确地知道这道题在哪,但我没写,也不会写,真是自闭。

    以后在考场上出现这种题,我就,我就不买衣服,不喝奶茶一个月。说到做到!

    题目出得真的很跳戏,不过我喜欢。

    把所有的谎言献给你β

    Description

    梓川咲太的面前坐着野兔先辈,作为约定,只好乖乖的打开笔记本开始学习了。

    “加法符号写歪了,变成了乘法符号,在算式的第三行那个地方。”樱岛麻衣突然开口。

    心领神会的梓川咲太立刻发现自己正在写的题目的错误,乖乖的改正了以后却心不在焉。

    毕竟,梓川咲太的眼神却很不老实,毕竟,眼前坐着野兔先辈。

    “咲太,假设我给你一个正整数n,你是不是可以把它用许多不同的整数(包括它自己)去减然后把n变成0?”

    樱岛麻衣开始穿上披风。

    这是生气的前兆,即将没了眼福的梓川咲太只能不停的点了点头。

    “那行,一个正整数n的做减法的操作过程也有很多种,比如说6就能变成6-6=0,6-1-5=0和6-2-4=0,对吧。但是不能变成6-3-3=0,因为3重复了。”

    樱岛麻衣用漂亮的字体在笔记本上书写。

    “当然写成6=6,6=1+5,6=2+4更好,相当于这些正整数构成一个序列{a1,a2,...,an}满足(Σai = N),(n >= 1),且这些正整数互不相同。”

    “那么刚刚的例子就是{6},{1,5},{2,4}这样。”

    “有没有想过把这些序列的数字乘起来呢?就像加法符号变成乘法一样,结果就是6,1x5,2x4这样......“

    ”就把这样操作后的结果称为M吧,对于一个正整数n,不同的拆分能得出不同的M,但M也是有最大值和最小值的。比如说刚刚那个例子,M的最大值是8,最小值是5。”

    此时的梓川咲太还不知道即将到来的地狱。

    “你刚刚的眼神这么不老实,大概看了几十下了吧。我就大发慈悲的写一些数字,你给我马上写出每个数字经过操作以后得出来的M的最小值和最大值。”

    “不把这些写完,今晚不让你睡哦。”

    麻衣打开的笔记本上密密麻麻的排列着许多数字,野兔先辈的代价实在是太大了,不过约定就是约定...... 

    Input

    第一行输入一个正整数T(T<=200),表示样例组数,接下去T行每行表示一组样例

    每组样例,输入一个正整数N(1<=N<=200) 

    Output

    输出总共T行,

    每行输出两个整数,表示每个数字经过操作以后得出的数字M的最小值和最大值,用一个空格隔开 

    Examples

    Input

    2
    3
    6

    Output

    2 3
    5 8
     

    正确解法:

    据说是暴搜找规律,写了两天暴搜,但这种新题型暴搜还不是很熟。

    真的是代码量多了不会写,代码少了考思维也不会。太难过了。

    暴搜:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
     4 #define LL long long
     5 #define ULL unsigned LL
     6 #define fi first
     7 #define se second
     8 #define pb push_back
     9 #define lson l,m,rt<<1
    10 #define rson m+1,r,rt<<1|1
    11 #define lch(x) tr[x].son[0]
    12 #define rch(x) tr[x].son[1]
    13 #define max3(a,b,c) max(a,max(b,c))
    14 #define min3(a,b,c) min(a,min(b,c))
    15 typedef pair<int,int> pll;
    16 const int inf = 0x3f3f3f3f;
    17 const LL INF = 0x3f3f3f3f3f3f3f3f;
    18 const LL mod =  (int)1e9+7;
    19 const int N = 5e5 + 100;
    20 int sta[N];
    21 int Max, gg;
    22 void dfs(int b, int l, int lt, int cnt){
    23     if(lt == 0){
    24         Max = max(Max, l);
    25         if(gg == l){
    26             for(int i = 1; i < cnt; ++i)
    27                 cout << sta[i] << ' ';
    28             cout << endl;
    29         }
    30     }
    31     for(int i = b; i <= lt; ++i){
    32         sta[cnt] = i;
    33         dfs(i+1, l*i, lt-i, cnt+1);
    34     }
    35 }
    36 int main(){
    37     int n;
    38     while(cin >> n){
    39         gg = -1;
    40         Max = 0;
    41         dfs(1, 1, n, 1);
    42         gg = Max;
    43         dfs(1, 1, n, 1);
    44     }
    45     return 0;
    46 }
    View Code

    正解:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
     4 #define LL long long
     5 #define ULL unsigned LL
     6 #define fi first
     7 #define se second
     8 #define pb push_back
     9 #define lson l,m,rt<<1
    10 #define rson m+1,r,rt<<1|1
    11 #define lch(x) tr[x].son[0]
    12 #define rch(x) tr[x].son[1]
    13 #define max3(a,b,c) max(a,max(b,c))
    14 #define min3(a,b,c) min(a,min(b,c))
    15 typedef pair<int,int> pll;
    16 const int inf = 0x3f3f3f3f;
    17 const LL INF = 0x3f3f3f3f3f3f3f3f;
    18 const LL mod =  (int)1e9+7;
    19 const int N = 1e5 + 100;
    20 LL Min[N], Max[N];
    21 vector<int> v;
    22 void init(){
    23     v.pb(2); v.pb(3);
    24     for(int i = 6; i <= 200; ++i){
    25         int t = v.size();
    26         if(v[0] != 2 && v[t-1] == v[t-2]+1)
    27             ++v[t-1];
    28         else if(v[0] != 2){
    29             --v[t-1];
    30             v.insert(v.begin(), 2);
    31         }
    32         else {
    33             int f = 1;
    34             for(int i = t-2; i >= 0; i--){
    35                 if(v[i]+1 != v[i+1]){
    36                     ++v[i];
    37                     f = 0;
    38                     break;
    39                 }
    40             }
    41             if(f) ++v[t-1];
    42         }
    43         Min[i] = i-1;
    44         Max[i] = 1;
    45         for(int x : v){
    46             Max[i] *= x;
    47         }
    48     }
    49 }
    50 vector<int> vc;
    51 int main(){
    52     int T, n;
    53     scanf("%d", &T);
    54     init();
    55     Min[1] = Max[1] = 1;
    56     Min[2] = Max[2] = 2;
    57     Min[3] = 2; Max[3] = 3;
    58     Min[4] = 3; Max[4] = 4;
    59     Min[5] = 4; Max[5] = 6;
    60     while(T--){
    61         scanf("%d", &n);
    62         printf("%lld %lld
    ", Min[n], Max[n]);
    63     }
    64     return 0;
    65 }
    View Code

    暴搜看懂了,会写了,但正解还没有看懂。

     暴搜找规律,发现最小值就等于n-1,最大值把因子都找出来,发现从5开始的开头数字

    两个2 两个3 三个2 两个3 四个2 两个3 五个2 两个3 ,把2和3凑成一块,发现一个周期。

    (5-8)(9-13)(14-19)

    1 int sum = 0, i = 2;
    2         while (sum + i <= n)
    3         {
    4             sum += i;
    5             i++;
    6         }

    这样sum是周期开头的数字,i是这个周期总共有的数字。  我们发现这个周期内的数的因子有 i-2 个

    当 sum==n 也就是说 n就是这个周期内开头的数字  n的最大值就是 (2*3*4*5*……)总共有 i-2 个数字相乘。

    再让我们看开头数字后面的数字,发现第二个数字 最后一个因子跳了一下,第三个数字 倒数第二个因子跳了一下 第四个数字 倒数第三个因子跳了一下

    到后面 周期中倒数第二个数字就直接从 3开头开始乘,可以理解为 跳的因子变成了第一个 ,也和前面发现的周期内倒数两个数以3开头相同。

    找出他是周期内第几个数字,发现跳的位置,从2开始乘,乘到跳的位置,+1,继续往后乘就好了。(总共有i-2个因子)

    最后一个就是从3开始,最后一个因子跳一下。就很好算了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string>
     4 #include<cstring>
     5 #include<map>
     6 #include<set>
     7 #include<algorithm>
     8 #include<cmath>
     9 using namespace std;
    10 int main()
    11 {
    12     int t;
    13     cin >> t;
    14     while (t--)
    15     {
    16         int n;
    17         long long ans = 1;
    18         cin >> n;
    19         if (n == 1 || n == 2)
    20         {
    21             cout <<n<<" "<< n << endl;
    22             continue;
    23         }
    24         int sum = 0, i = 2;
    25         while (sum + i <= n)
    26         {
    27             sum += i;
    28             i++;
    29         }
    30         if (sum == n)
    31         {
    32             int j = 2;
    33             for (int kk = 1; kk <= i - 2; kk++)
    34             {
    35                 ans *= j;    j++;
    36             }
    37         }
    38         else if (n - sum <= i - 2)
    39         {
    40             int tiao = n - sum, j = 2;
    41             for (int kk = 1; kk <= i - 2 - tiao; kk++)
    42             {
    43                 ans *= j;    j++;
    44             }
    45             j++;
    46             for (int kk = 1; kk <= tiao; kk++)
    47             {
    48                 ans *= j;    j++;
    49             }
    50         }
    51         else
    52         {
    53             int j = 3;
    54             for (int kk = 1; kk < i - 2; kk++)
    55             {
    56                 ans *= j;    j++;
    57             }
    58             j++;
    59             ans *= j;
    60         }
    61         cout <<n-1<<" "<< ans << endl;
    62     }
    63     return 0;
    64 }
    弱鸡的if else 解法

    以行走般的速度β

    Description

    今天的理科实验室依旧回响着气泡的大合唱。

    梓川咲太一边看应考的题目一边听着声音的变化,同时思索该如何回答考察数学思维的题目......

    就算解决了牧之原翔子和樱岛麻衣的问题,也终究要面对现实的考验。

    “梓川你不是要和樱岛麻衣前辈考同一个大学吗?”

    双叶理央坐在咲太的面前,今天也依然披着白大褂,正在准备不知名的实验。

    “是啊。之前不是说过吗?所以我现在忙于备考。”

    “我就友善的提醒你一句...”

    “什么?”

    “你看的是我的算法竞赛书......”双叶理央用略带担忧的声音这么说着。

    梓川咲太突然回过神来,他翻了翻书本后面的内容,的确是和程序有关。但是前面的例题部分做的却和普通的参考书别无二致。

    双叶拿回了她的算法书,找着梓川刚刚在看的部分。

    “给出一个大于等于2的正整数n,对于一对数a和b(2<=|a|,|b|<=n,a!=b),如果存在一个整数x(|x|>=1)使得ax=b(或bx=a),就可以将a转换成b(或将b转换为a),转换后,你可以获得|x|的积分。”

    一边说着,双叶就开始在黑板上写一些算式。

    “不过,限制条件是,转换完毕后,就不能再使用由a转换成b或b转换成a的转换方式了。“

    ”一开始拥有的积分是0,现在给一个大于等于2的正数n,可以在2~n都取一次起点进行转换(更换起点时,转换方式不初始化)。请问最多可以获得多少分?”

    “双叶老师,我实在是听不懂。”

    梓川咲太很爽快的袒露了事实。



    比如说n等于4的时候答案是11,因为

    取起点为2时,你的最多得分是9。其中的一种得分方式是 2→(-2)→4→2→(-4)→(-2);

    取起点为3时,你只能得1分,3→(-3);

    取起点为4时,你别的转换方式都使用过,因此只能得1分,4→(-4)。

    所以最终答案是9+1+1=11,明白了吗?



    黑板上已经密密麻麻写了一堆公式,在右下角又写了一个Accepted。看来双叶理央已经在脑内解决了这个问题。

    不过对于咲太来说这依旧是一个难题。虽然不是应考的范围,但既然看了这么久,也就顺便解答出来吧。 

    Input

    多组输入输出。

    对于每一组数据,输入一个整数n(2<=n<=100000)

    保证n的个数小于200,n的总和不超过5000000 

    Output

    对于每一组样例

    输出梓川咲太最大能够得到的分数 

    Examples

    Input

    2
    4
    6

    Output

    1
    11
    33
     

    正确解法:

    挖坑了qaq

    好吧还是没懂。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
     4 #define LL long long
     5 #define ULL unsigned LL
     6 #define fi first
     7 #define se second
     8 #define pb push_back
     9 #define lson l,m,rt<<1
    10 #define rson m+1,r,rt<<1|1
    11 #define lch(x) tr[x].son[0]
    12 #define rch(x) tr[x].son[1]
    13 #define max3(a,b,c) max(a,max(b,c))
    14 #define min3(a,b,c) min(a,min(b,c))
    15 typedef pair<int,int> pll;
    16 const int inf = 0x3f3f3f3f;
    17 const LL INF = 0x3f3f3f3f3f3f3f3f;
    18 const LL mod =  (int)1e9+7;
    19 const int N = 1e5 + 100;
    20 int vis[N];
    21 void init(){
    22     for(int i = 2; i < N; ++i){
    23         for(int j = i+i, t = 2; j < N; j+=i, t++){
    24                 vis[j] += t;
    25         }
    26     }
    27 }
    28 int main(){
    29     init();
    30     int n;
    31     while(~scanf("%d", &n)){
    32         LL sum = 0;
    33         for(int i = 2; i <= n; ++i){
    34             sum += vis[i];
    35         }
    36         printf("%lld
    ", sum*4+n-1);
    37     }
    38     return 0;
    39 }
    View Code

     因为每个起点都可以重复4次,于是就成为了枚举因子。

    我们递推找,当n==2是1,当n==3 是 2 (2-(-2))(3-(-3))

    当n=4 2是4的因子,2*4+3

    最后就是找n的因子,因子*4+n-1

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string>
     4 #include<cstring>
     5 #include<map>
     6 #include<set>
     7 #include<algorithm>
     8 #include<cmath>
     9 using namespace std;
    10 bool zhi(int x)
    11 {
    12     if (x <= 1)    return 0;
    13     for (int i = 2; i*i <= x; i++)
    14         if (x%i == 0)    return 0;
    15     return 1;
    16 }
    17 long long yin(int x)
    18 {
    19     long long ans = 0;
    20     for (int i = 2; i*i <= x; i++)
    21     {
    22         if (x%i == 0)
    23         {
    24             ans += i;
    25             if (i*i != x)
    26                 ans += x / i;
    27         }
    28     }
    29     return ans;
    30 }
    31 int main()
    32 {
    33     int n ;
    34     long long a[100100] = { 0 };
    35     for (int i = 2; i <= 100000; i++)
    36     {
    37         if (zhi(i))
    38             a[i] = a[i - 1];
    39         else
    40             a[i] = a[i - 1] + yin(i);
    41     }
    42     while (cin >> n)
    43     {
    44         cout << a[n] * 4 + n - 1 << endl;
    45     }
    46     return 0;
    47 }
    View Code

    灰暗而空虚的景色β

    Description

    “雪啊。”

    “雪是红色的。”

    像坏掉的复读机一样,梓川咲太只能把闪烁的思绪断断续续的说出来。

    “这,是梦吧。”

    从口中滑出的却是这样的话。

    回过神的时候,天空即将被冰冷黑暗的天空吞没,而自己已经站在湘南台站附近的图书馆的门口。那是第一次遇见樱岛麻衣的地方,是一切的开端。

    无所谓了,已经没有可以称为家而能回去的地方了。就在梓川咲太开始自暴自弃的躺在地上任由黑暗吞噬的时候。

    眼前突然出现了穿着白大褂的年轻女子,在昏暗的路灯下,随风飘扬的似乎是红色的秀发。

    “不要去轻易的改变过去。”开口便是这么难懂的话。

    “打个比方,对于一个长度为n,所有元素都为0的数列。每次操作都选取一个位置,使得从这个位置往后都变成1,4,9,16...i^2 ”

    “不可思议啊,为什么我一直在,为什么你们,一直在让我做这种数学题。”梓川咲太快濒临崩溃了。

    “为了拯救樱岛麻衣和牧之原翔子。这样的理由够充分吗?”那位女子的一句话,让咲太的精神从深海下看到一束光。

    “你能计算出经过这么多次操作以后变得面目全非的数列的和吗?”

    “不可随便改变过去,就刚才那个比方来说,如果有很多次这样的操作,那么这个数列的和也很难计算吧。”

    “可你现在就是面临这个问题哦。计算出那个数列的和,你一定能够知道答案。”这是只有拥有确信的心的人才能说出来的话。

    “算出来以后呢。”梓川咲太还需要最后一块拼图。

    “去找牧之原翔子吧,一切因她而始,也必定一切因她而终。”

    时间的流动在慢慢的将咲太唤回现实。

    “许多失败了的未来,无法挽回的过去,但是肯定在这之后,会有连接到......”

    熟悉的话语再次传来。但话语的主人已经消失在夜空里。 

    Input

    第一行输入一个数字T(T<=10)表示数据有多少组;

    每一组数据第一行包含两个整数n(1<=n<=1e9),Q(Q<=5e4),分别表示数列的长度以及操作的个数。

    接下来的Q个数按照操作的时间顺序给出每次操作选择的位置. 

    Output

    输出一个数字表示这个数列的和,由于答案可能很大,所以你需要将答案mod 123456789。

    Examples

    Input

    1
    3 2
    3
    1

    Output

    14
     

    正确解法:

    想出来了,应该是那种堆的感觉。大于的话就加在后面,小于的话就代替前面的。

    最后就是爆 long long 了,不知道怎么做了。

    (int128是什么,为什么我的两个编辑器都不能用!)

    自我感觉良好,但是wa了的code:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string>
     4 #include<cstring>
     5 #include<map>
     6 #include<algorithm>
     7 #include<cmath>
     8 using namespace std;
     9 int c[501000], kk = 0;
    10 int main()
    11 {
    12     int t;
    13     cin >> t;
    14     while (t--)
    15     {
    16         int n, m,b;
    17         cin >> n >> m;
    18         cin >> b;
    19         c[++kk] = b;
    20         for (int i = 2; i <= m; i++)
    21         {
    22             cin >> b;
    23             if (b > c[kk])
    24                 c[++kk] = b;
    25             else
    26             {
    27                 int tt = lower_bound(c+1,c+kk+1,b)-c;
    28                 c[tt] = b;
    29                 kk = tt;
    30             }
    31         }
    32         int ans = 0;
    33         for (int i = 2; i <= kk; i++)
    34         {
    35             int tt = c[i] - c[i - 1];
    36             tt = (tt * (tt + 1) % 123456789 * (2 * tt +1))/6% 123456789;
    37             ans += tt;
    38             ans = ans % 123456789;
    39         }
    40         int tt = n - c[kk] + 1;
    41         tt = (tt * (tt + 1)% 123456789 * (2 * tt + 1)%123456789 )/6% 123456789;
    42         ans += tt;
    43         cout << ans%123456789 << endl;
    44     }
    45 
    46     return 0;
    47 }
    View Code

     哇真的是不认识__int128 ,没运行直接提交居然A了:

    (上面code改了一点点的)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string>
     4 #include<cstring>
     5 #include<map>
     6 #include<algorithm>
     7 #include<cmath>
     8 using namespace std;
     9 int c[501000], kk = 0;
    10 long long cal(long long x)
    11 {
    12     __int128 v = x;
    13     v=v*(v+1)*(2*v+1)/6;
    14     v=v%123456789;
    15     return v;
    16 }
    17 int main()
    18 {
    19     int t;
    20     cin >> t;
    21     while (t--)
    22     {
    23         int n, m,b;
    24         cin >> n >> m;
    25         cin >> b;
    26         c[++kk] = b;
    27         for (int i = 2; i <= m; i++)
    28         {
    29             cin >> b;
    30             if (b > c[kk])
    31                 c[++kk] = b;
    32             else
    33             {
    34                 int tt = lower_bound(c+1,c+kk+1,b)-c;
    35                 c[tt] = b;
    36                 kk = tt;
    37             }
    38         }
    39         long long ans = 0;
    40         for (int i = 2; i <= kk; i++)
    41         {
    42             long long tt=c[i]-c[i-1];
    43             ans+=cal(tt);
    44         }
    45         long long tt = n - c[kk] + 1;
    46         ans += cal(tt);
    47         cout << ans%123456789 << endl;
    48     }
    49 
    50     return 0;
    51 }
    View Code

    xk大佬ac的code:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
     4 #define LL long long
     5 #define ULL unsigned LL
     6 #define fi first
     7 #define se second
     8 #define pb push_back
     9 #define lson l,m,rt<<1
    10 #define rson m+1,r,rt<<1|1
    11 #define lch(x) tr[x].son[0]
    12 #define rch(x) tr[x].son[1]
    13 #define max3(a,b,c) max(a,max(b,c))
    14 #define min3(a,b,c) min(a,min(b,c))
    15 typedef pair<int,int> pll;
    16 const int inf = 0x3f3f3f3f;
    17 const LL INF = 0x3f3f3f3f3f3f3f3f;
    18 const LL mod = 123456789;
    19 const int N = 1e5 + 100;
    20 int T;
    21 int a[N];
    22 LL cal(int x){
    23     __int128 v = x;
    24     v = v * (v+1) * (v*2+1)/6;
    25     v %= mod;
    26     return v;
    27 }
    28 int main(){
    29     scanf("%d", &T);
    30     while(T--){
    31         int n, m;
    32         scanf("%d%d", &n, &m);
    33         LL ans = 0;
    34         for(int i = 1; i <= m; ++i)
    35             scanf("%d", &a[i]);
    36         int lat = n+1;
    37         for(int i = m; i >= 1; --i){
    38             if(lat <= a[i]) continue;
    39             ans += cal(lat-a[i]);
    40             ans %= mod;
    41             lat = a[i];
    42         }
    43         ans = (ans%mod)+mod;
    44         ans %= mod;
    45         printf("%lld
    ", ans);
    46     }
    47     return 0;
    48 }
    View Code

    Complex Congratulation β

    Description

    梓川咲太在解决了樱岛麻衣和丰浜和花互换身体的事件以后,又陷入到了新的麻烦里面。

    ......

    “你们真的在交往吗?”

    “是的,这是事实。”

    樱岛麻衣即使有点不好意思,也依然坦诚真相。

    “对方是个没神经的男生,三个月前向着全校学生向我表白。那个......”,麻衣以害羞的表情慎选言辞“我虽然一度保留,但还是被他的毅力折服了。”

    记者们一连串的发问都被樱岛麻衣轻松的化解,明明是新电影发布会的现场,可是记者们对樱岛麻衣的发问却没有平息的征兆。

    在一旁看着的经纪人——凉子小姐心有余悸。明星的恋爱一直是禁忌的话题,稍有差池就会断送艺人生涯。但是眼前的樱岛麻衣却能借助发布会的现场,把气氛往有利于自己的方向发展。

    这自然和樱岛麻衣本身超高的交流技巧有关,还和观众有关。

    “如果有话要对男朋友说,可以请您在这里说吗?”提出请求而不是询问的记者是南条文香,和梓川咲太认识,一直在追踪调查“青春期症候群”。

    “不要,我要当面和他说。”樱岛麻衣难为情的笑了,那是有点害羞又有非常幸福,能烙印在灵魂深处的表情,她以这样一句话作为话题的结束。

    发布会后,凉子小姐看到事情的局面发展如此顺利,想起了那天晚上樱岛麻衣小姐和她的面谈。

    “对于气氛的引导”,樱岛麻衣在凉子小姐前正襟危坐“我需要过半数的记者支持我。”

    “怎么界定这个支持呢?”

    “记者对于明星恋爱能不能正面的报到,这个是最重要的。你的电脑里面也有关于记者的各种资料吧。拿来给我看一下。”

    樱岛麻衣接过凉子小姐的电脑,熟练的打开excel,进行了一番操作以后,又把电脑给了凉子小姐。

    “每个记者都有{00,10,01,11}四个数字其中的一个,还有一个数字,指的是这个记者的影响力。”

    “两个观念A和B,0代表不支持,1代表支持。南条文香记者的右边是11,表示的是即支持A又支持B。而这个记者的右边是01,说明不支持A但支持B。00的话说明两个都不支持。”

    “凉子小姐,你能不能帮我建立这个一个名单,人数不限,这上面的记者既有超过半数的人支持A,又有超过半数的人支持B。而且这个名单的人的总影响力最大?”

    凉子小姐开始打开Visual Studio 2017。她知道这个问题只能用程序来解决,也将决定樱岛麻衣的艺人生涯。 

    Input

    多组输入输出

    第一行一个整数n,表示有n个记者(1<=n<=400000)

    接下来n行,每行有两个数。

    第一个数是{00,01,10,11}的其中一个,表示第i个记者的支持取向。

    第二个数是ai (0<=ai<5000),表示第i个记者的影响力。

    所有测试数据的n的和不超过500000 

    Output

    输出一个数字,表示能取得的最大的总影响力

    Examples

    Input

    5
    11 1
    01 1
    00 100
    10 1
    01 1

    Output

    103
     

    正确解法:

    四种类型的排序。

    原本wa的是因为,11都可以跟01/10/00都可以配。而我以为11只能跟00配对。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string>
     4 #include<cstring>
     5 #include<map>
     6 #include<algorithm>
     7 #include<cmath>
     8 using namespace std;
     9 int n, a[400100], b[400100], c[400100], d[400100], kk;
    10 int k1 = 0, k2 = 0, k3 = 0, k4 = 0;
    11 char s[5];
    12 bool cmp(int a, int b)
    13 {
    14     return a > b;
    15 }
    16 int main()
    17 {
    18     while (cin >> n)
    19     {
    20         memset(a, 0, sizeof(a));
    21         memset(b, 0, sizeof(b));
    22         memset(c, 0, sizeof(c));
    23         memset(d, 0, sizeof(d));
    24         k1 = 0;    k2 = 0;
    25         k3 = 0;    k4 = 0;
    26         for (int i = 1; i <= n; i++)
    27         {
    28             cin >> s;
    29             cin >> kk;
    30             if (s[0] == '1'&&s[1] == '0')    a[++k1] = kk;
    31             else if (s[0] == '0'&&s[1] == '1')    b[++k2] = kk;
    32             else if (s[0] == '0'&&s[1] == '0')    c[++k3] = kk;
    33             else if (s[0] == '1'&&s[1] == '1')    d[++k4] = kk;
    34         }
    35         sort(a + 1, a + k1 + 1, cmp);
    36         sort(b + 1, b + k2 + 1, cmp);
    37         sort(c + 1, c + k3 + 1, cmp);
    38         sort(d + 1, d + k4 + 1, cmp);
    39         int ans = 0;
    40         for (int i =1; i<=k4; i++)
    41             ans += d[i];
    42         for (int i = 1; i <= min(k1, k2); i++)
    43             ans += a[i] + b[i];
    44         //cout << ans << endl;
    45         if (k1 > k2)
    46         {
    47             int tt = 0;
    48             int xa = min(k1, k2) + 1, xc = 1;
    49             while (tt <k4)
    50             {
    51                     tt++;
    52                     if (a[xa] > c[xc])
    53                     {
    54                         ans += a[xa];
    55                         xa++;
    56                     }
    57                     else
    58                     {
    59                         ans += c[xc];
    60                         xc++;
    61                     }
    62             }
    63         }
    64         else
    65         {
    66             int tt = 0;
    67             int xb = min(k1, k2) + 1, xc = 1;
    68             while (tt < k4)
    69             {    
    70                 tt++;
    71                 if (b[xb] > c[xc])
    72                 {
    73                     ans += b[xb];
    74                     xb++;
    75                 }
    76                 else
    77                 {
    78                     ans += c[xc];
    79                     xc++;
    80                 }
    81             }
    82         }
    83         cout << ans << endl;
    84     }
    85     return 0;
    86 }
    View Code

    这么长代码,比赛时我肯定自己先崩,不过不管那么多我还是A了。

    No matter how you feel, get up , dress up , show up ,and never give up.
  • 相关阅读:
    Linux下PHP安装配置MongoDB数据库连接扩展
    Linux下安装配置MongoDB数据库
    解决VMWARE 虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态
    nginx配置多域名
    nginx File not found 错误
    RunLoop与NSTimer的经典面试题
    子线程上的RunLoop运行循环
    主线程上的RunLoop运行循环
    RunLoop运行循环/消息循环
    自动释放池和运行/消息循环
  • 原文地址:https://www.cnblogs.com/Kaike/p/10050820.html
Copyright © 2011-2022 走看看