国庆5
Posted bhd123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了国庆5相关的知识,希望对你有一定的参考价值。
Codeforces 1060 b
You are given a positive integer nn.
Let S(x)S(x) be sum of digits in base 10 representation of xx, for example, S(123)=1+2+3=6S(123)=1+2+3=6, S(0)=0S(0)=0.
Your task is to find two integers a,ba,b, such that 0≤a,b≤n0≤a,b≤n, a+b=na+b=n and S(a)+S(b)S(a)+S(b) is the largest possible among all such pairs.
In the first example, you can choose, for example, a=17a=17 and b=18b=18, so that S(17)+S(18)=1+7+1+8=17S(17)+S(18)=1+7+1+8=17. It can be shown that it is impossible to get a larger answer.
In the second test example, you can choose, for example, a=5000000001a=5000000001 and b=4999999999b=4999999999, with S(5000000001)+S(4999999999)=91S(5000000001)+S(4999999999)=91. It can be shown that it is impossible to get a larger answer.
35
17
10000000000
91
该题:
10的12 次方,不能用ll,只能用char 数组。贪心思想:九越多越好,把这个数分成比他少一位数,都是9的数例如:
100 :99 1;
也就是从字符串的最后开始往前找(我的做法,不知道从前往后行不行)如果这个字符比九小,例如 23,走到3,发现比9小,那么另一个数这一位就是4(因为你是想把3这一位拆乘9)2就要-1成为1。
做法中没有讨论遇到108 - 9 的情况,因为这样做每一步都能保证运行到该行时他的值都大于0,最后加上最开头以为数字-‘0’;
#include <iostream> #include <algorithm> #include<cstdio> #include<stack> #include <deque> #include <cstdlib> #include <cstring> #include <string> #include <map> #include <deque> #include <vector> using namespace std; typedef long long ll; map<int,int>mp; int main() { char a[100]; int i,ans=0; scanf("%s",a); int a1=strlen(a); for(i=a1-1;i>=1;i--) { if(a[i]==‘9‘) { ans+=9; } else { ans+=a[i]-‘0‘+10; a[i-1]-=1; } } ans+=a[i]-‘0‘; printf("%d ",ans); }
Codeforces 712 c
一个等边三角形,由大的变成小的要最少多少步,而且保证每一步都是三角形。
该题应该考虑从小加到大,因为这样加的时候是可以有据可依的(保证是三角形):两边之和大于第三边。然后再用贪心的思想,三个数轮着变成另外两个数相加-1,保证这样是步数最少的。
如果到了一个数大于要求的边时,break,然后加2,因为要变成等边三角形:
#include <iostream> #include <algorithm> #include<cstdio> #include<stack> #include <deque> #include <cstdlib> #include <cstring> #include <string> #include <map> #include <deque> #include <vector> using namespace std; typedef long long ll; map<int,int>mp; int main() { int a,b; scanf("%d%d",&a,&b); int x=b,y=b,z=b; int flag=1; int ans=0; while(1) { if(x==a&&y==a&&z==a) break; if(flag==1) { flag++; x=y+z-1; ans++; if(x>=a) break; } if(flag==2) { ans++; flag++; y=x+z-1; if(y>=a) break; } if(flag==3) { ans++; flag=1; z=x+y-1; if(z>=a) break; } } printf("%d ",ans+2); }
Codeforces 712 B
这个题就是一个人能上下左右走,最好要回到原点,让你改变他的路径例如,样例给的lruu,你要回去所以u要变成d,问最少要变几次。
这个题可以考虑对称,从原点开始走,最后回到原点。
左右对称,抵消掉,剩下的就是左右的差,上下的差,如果他们的和是偶数,则能改变,否在无论如何多一个无法回到原点。
#include <iostream> #include <algorithm> #include<cstdio> #include<stack> #include <deque> #include <cstdlib> #include <cstring> #include <string> #include <map> #include <deque> #include <vector> using namespace std; typedef long long ll; map<int,int>mp; int main() { char a[100100]; int i,j,ge1=0,ge2=0; scanf("%s",a); int a1=strlen(a); for(i=0; i<=a1-1; i++) { if(a[i]==‘L‘) ge1++; if(a[i]==‘R‘) ge1--; if(a[i]==‘U‘) ge2++; if(a[i]==‘D‘) ge2--; } if((abs(ge1)+abs(ge2))%2!=0) printf("-1 "); else printf("%d ",(abs(ge1)+abs(ge2))/2); }
以上是关于国庆5的主要内容,如果未能解决你的问题,请参考以下文章