NOIP普及组2018题解

T1 标题统计

题目链接:
  https://www.luogu.org/problemnew/show/P5015
思路:
  因为不记空格和换行,就把它当成多组数据读入就好啦~
代码:
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int ans;
 5 string s;
 6 
 7 int main()
 8 {
 9     while(cin >> s)
10     {
11         ans += s.size();
12     }
13     cout << ans << endl;
14     return 0;
15 } 

T2 龙虎斗

题目链接:

  https://www.luogu.org/problemnew/show/P5016

思路:

  1.计算出两边的势力

  for(int i=1; i<m; i++)
  {
    Power_L += a[i] * (m - i);
  }
  for(int i=m+1; i<=n; i++)
  {
      Power_R += a[i] * (i - m);
  }

  2.处理左边势力大于右边的情况:

   ∵右边>左边,所以要想让势力差尽可能小,要么在左边添加,要么在m,不可能在右边再添加

    if(Power_L < Power_R)
    {
        for(int i=1; i<=m; i++)
        {
            LL Now = abs(Power_R - Power_L - s2 * (m - i));
            if(Now < min1)
            {
                min1 = Now;
                p2 = i;
            }
        }
    }    

  3.同理,处理右边势力大于左边的情况

    else if(Power_L > Power_R)
    {
        for(int i=m; i<=n; i++)
        {
            LL Now = abs(Power_L - Power_R - s2 * (i - m));
            if(Now < min1)
            {
                min1 = Now;
                p2 = i;
            }
        }
    }    

  4.当左边等于右边时,在m上添加不影响

    else
    {
        p2 = m;
    }

代码:

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 const int MAXN = 100010;
 7 #define LL long long
 8 
 9 int n, m, p1, p2;
10 LL s1, s2, a[MAXN], Power_L, Power_R, min1;
11 
12 int main()
13 {
14     scanf("%d", &n);
15     min1 = 1000000000; 
16     for(int i=1; i<=n; i++)
17     {
18         scanf("%lld", &a[i]);
19     }
20     scanf("%d %d %d %d", &m, &p1, &s1, &s2);
21     a[p1] += s1;
22     for(int i=1; i<m; i++)
23     {
24         Power_L += a[i] * (m - i);
25     }
26     for(int i=m+1; i<=n; i++)
27     {
28         Power_R += a[i] * (i - m);
29     }
30     //cout << Power_L << " " << Power_R << endl;
31     if(Power_L < Power_R)
32     {
33         for(int i=1; i<=m; i++)
34         {
35             LL Now = abs(Power_R - Power_L - s2 * (m - i));
36             if(Now < min1)
37             {
38                 min1 = Now;
39                 p2 = i;
40             }
41         }
42     }
43     else if(Power_L > Power_R)
44     {
45         for(int i=m; i<=n; i++)
46         {
47             LL Now = abs(Power_L - Power_R - s2 * (i - m));
48             if(Now < min1)
49             {
50                 min1 = Now;
51                 p2 = i;
52             }
53         }
54     }
55     else
56     {
57         p2 = m;
58     }
59     printf("%d", p2);
60     return 0;
61 }

猜你喜欢

转载自www.cnblogs.com/LonelyFish/p/10498777.html