牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含一个正整数,表示转方向的次数N(N<=1000)。
接下来的一行包含一个长度为N的字符串,由L和R组成,L表示向左转,R表示向右转。
输出描述:
输出牛牛最后面向的方向,N表示北,S表示南,E表示东,W表示西。
输入例子1:
3 LRR
输出例子1:
E
#include <iostream> using namespace std; char s[1005]; char dir[4]="NESW"; int main() { int n; cin>>n; cin>>s; int now=0; for(int i=0;i<n;++i) if(s[i]==‘R‘) now=(now+1)%4; else now=(now+3)%4; cout<<dir[now]<<endl; }
#include<iostream> #include<string> using namespace std; void printDirection(int num){ switch(num%4){ case -3: cout << ‘E‘ <<endl; break; case -2: cout << ‘S‘ <<endl; break; case -1: cout << ‘W‘ <<endl; break; case 0: cout << ‘N‘ <<endl; break; case 1: cout << ‘E‘ <<endl; break; case 2: cout << ‘S‘ <<endl; break; case 3: cout << ‘W‘ <<endl; break; } } int main(){ int n; while(cin >> n){ string inStr; int dir = 0; cin >> inStr; for(int i=0; i<inStr.length(); i++){ if(inStr[i] == ‘L‘) dir += -1; else dir += 1; } printDirection(dir); } return 0; }
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
输入描述:
输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。
输出描述:
对于每个测试用例, 输出一个正整数表示可能的数对数量。
输入例子1:
5 2
输出例子1:
7
例子说明1:
满足条件的数对有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3)
朴素的做法是枚举n^2个点然后跟k作比较。这显然对n<=100000的规模来说是不允许通过的。
注意到当除数是y时,当x=1~n时,余数是1,2,3,...,y-1,0循环出现,循环节长度显然是y
那么我们可以枚举y=k~n(当y<k时所有余数均小于k,因此不需要考虑)
然后对于x=1~n,总共出现了[n/y]个循环节,然后数出每个循环节里面不小于k的余数。最后再数出不满一个循环节的不小于k的余数,就是答案了。注意当k=0的时候由于余数0出现在循环的末尾,因此要特别判断。
复杂度为O(n)
#include <iostream> #include <algorithm> using namespace std; int main() { long long n,k; cin>>n>>k; long long ans=0; for(int y=max(1LL,k);y<=n;++y) { int res=0; res=n/y*(y-k); if(n%y>=k) if(k) res+=n%y-k+1; else res+=n%y; ans+=res; } cout<<ans<<endl; }
给你一些序列1,12,123,1234,12345,123456,1234567,12345678,123456789,12345678910,1234567891011,.....给你两个数字a,b,问第a个序列到第b个序列之间能被三整除的数的个数。
解题思路:发现规律,每三个序列为一组1,12,123,第一个数不能被3整除,第二个第三个数能被三整除,1234,12345,123456,第一个数不能被三整除,第二个和但三个数能被三整除。
#include <cstdio> int main() { int t; scanf("%d",&t); int kcase=1; while(t--) { int a,b; scanf("%d%d",&a,&b); int tmp1=b/3;//找到前面有多少组3 tmp1=tmp1*2;//每组有两个能被三整除 if(b%3==2)//看这个数本身能否被3整除,即排在该组的第二个数 { tmp1=tmp1+1; } int tmp2=a/3;//同上 tmp2=tmp2*2; if(a%3==2) { tmp2=tmp2+1; } int ans=tmp1-tmp2; if(a%3==0||a%3==2)//如果是第三个数或第二个数,那么多减了a这个数,那么补上去 { ans++; } printf("Case %d: %d\n",kcase++,ans); } return 0; }
思路:该题涉及的数字比较大,不能直接用整形或是长整型来存储数字,可以用字符串来存储数字,判定能否被3整除的方法就是看将数字各位的数相加得到的数能否被3整除。
#include<iostream> #include<string> using namespace std; bool divide(string str) { int num = 0; for (int i = 0; i < str.length(); i++) { num += (str[i] - ‘0‘); } if (num % 3 == 0) { return true; } return false; } int main() { int l = 0, r = 0, count = 0; string num = ""; cin >> l >> r; for (int i = 1; i <= l; i++) { num += to_string(i); } for (int i = l; i <= r; i++) { if (divide(num)) count++; num += to_string(i + 1); } cout << count << endl; return 0; }