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 }