标签:for problem esc rip while 这一 flag 就是 str
------------恢复内容开始------------
解题思路:这题就只有n或者m为1;或者n=2,m=2的时候才能够达成题目的目标。所以将这两个特判一下,其他的直接输出NO就行了
1 //#include<bits/stdc++.h> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cstring> 6 #include <string> 7 #include <algorithm> 8 #include <cmath> 9 #include <queue> 10 #define mem(a) memset(a,0,sizeof(a)) 11 #define forn(i,n) for(int i=0;i<n;++i) 12 #define for1(i,n) for(int i=1;i<=n;++i) 13 #define IO std::ios::sync_with_stdio(false); std::cin.tie(0) 14 #define ll long long 15 #define inf 0x3f3f3f3f 16 #define lowbit(x) x&(-x) 17 using namespace std; 18 const int maxn=1e6+5; 19 int n,a,b,c,k,u,t,m; 20 21 22 int main() 23 { 24 IO; 25 cin>>t; 26 while(t--) 27 { 28 cin>>n>>m; 29 if(n==1||m==1||(n==2&&m==2)) 30 cout<<"YES"<<endl; 31 else 32 cout<<"NO"<<endl; 33 } 34 return 0; 35 }
解题思路:
这一题先是考虑着打表查找,但是思考了一下觉得这样查找就成了大问题。所以,从表到数据是不行的,那就只有从数据出发来找和他最近的那个数的关系了。
于是我们能够列出方程 (3n+n) / 2 <= x 可利用一下求根公式来进行求解得到 n = (-1 + sqrt(24x+1)) / 6; 又因为题目中的x的范围1e9,所以我们计算的时候要注意24倍要用long long类型
我们每次算出来最近的那个数就用x减去它,直到无法找到这个数(也就是n=0)的时候,程序结束,输出答案
代码如下:
1 //#include<bits/stdc++.h> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cstring> 6 #include <string> 7 #include <algorithm> 8 #include <cmath> 9 #include <queue> 10 #define mem(a) memset(a,0,sizeof(a)) 11 #define forn(i,n) for(int i=0;i<n;++i) 12 #define for1(i,n) for(int i=1;i<=n;++i) 13 #define IO std::ios::sync_with_stdio(false); std::cin.tie(0) 14 #define ll long long 15 #define inf 0x3f3f3f3f 16 #define lowbit(x) x&(-x) 17 using namespace std; 18 const int maxn=1e6+5; 19 ll n,x,k,u,t,m; 20 int num[maxn]; 21 22 void init() 23 { 24 int tmp,tot; 25 tot=0; 26 for(int i=1;i<100;++i) 27 { 28 tot+=i; 29 num[i]=3*tot-i; 30 cout<<num[i]<<endl; 31 } 32 } 33 34 int main() 35 { 36 IO; 37 cin>>t; 38 while(t--) 39 { 40 int ans=0; 41 cin>>x; 42 while(1) 43 { 44 n=(sqrt(24*x+1)-1)/6; 45 if(!n) break; 46 u=(3*n+1)*n/2; 47 x-=u; 48 ans++; 49 } 50 cout<<ans<<endl; 51 } 52 return 0; 53 }
解题思路:这一题就是让你把一段数轴上的数按照它的规则进行移动,然后判断有没有重复的或者出界的
他的规则是对于 i 位置上的数,将其移动 到 ( i + a[ i ] ) % n 如果小于0,就加上 n,然后再用另一个数组来记录移动后的情况
判断一下有没有重复或者空缺的情况就可以了
代码如下:
1 //#include<bits/stdc++.h> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cstring> 6 #include <string> 7 #include <algorithm> 8 #include <cmath> 9 #include <queue> 10 #define mem(a) memset(a,0,sizeof(a)) 11 #define forn(i,n) for(int i=0;i<n;++i) 12 #define for1(i,n) for(int i=1;i<=n;++i) 13 #define IO std::ios::sync_with_stdio(false); std::cin.tie(0) 14 #define ll long long 15 #define inf 0x3f3f3f3f 16 #define lowbit(x) x&(-x) 17 using namespace std; 18 const int maxn=1e6+5; 19 ll n,x,k,u,t,m; 20 int a[maxn]; 21 int b[maxn]; 22 23 24 int main() 25 { 26 IO; 27 cin>>t; 28 while(t--) 29 { 30 bool flag=false; 31 cin>>n; 32 forn(i,n) 33 { 34 cin>>a[i]; 35 b[i]=0; 36 } 37 forn(i,n) 38 { 39 k=(i+a[i])%n; 40 if(k<0) k+=n; 41 b[k]++; 42 } 43 forn(i,n) 44 { 45 if(b[i]==0||b[i]>1) 46 flag=true; 47 } 48 if(flag) 49 cout<<"NO"<<endl; 50 else 51 cout<<"YES"<<endl; 52 } 53 return 0; 54 }
------------恢复内容结束------------
CodeForces Round #639 div2 前三题
标签:for problem esc rip while 这一 flag 就是 str
原文地址:https://www.cnblogs.com/bethebestone/p/12846032.html