无耻的复制大佬的代码
1001
怎么写模拟都过不去,只能用数学方式写了
合理的摆放就两种,一种平分,一种一个小的和两个大的放在一块
我们取最小值
1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cmath> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<stack> 9 #include<cstring> 10 #include<vector> 11 #include<list> 12 #include<set> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define pi (4*atan(1.0)) 17 #define eps 1e-14 18 #define bug(x) cout<<"bug"<<x<<endl; 19 const int N=1e5+10,M=1e6+10,inf=2147483647; 20 const ll INF=1e18+10,mod=2147493647; 21 ll a[10]; 22 int main() 23 { 24 while(~scanf("%d%d%d",&a[0],&a[1],&a[2])) 25 { 26 sort(a,a+3); 27 if(a[2]>=(a[1]+a[0])*2) 28 printf("%d ",a[0]+a[1]); 29 else 30 printf("%d ",(a[0]+a[1]+a[2])/3); 31 } 32 return 0; 33 }
1002
没啥好说的,注意等于0的情况
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define ll long long #define pi (4*atan(1.0)) #define eps 1e-14 #define bug(x) cout<<"bug"<<x<<endl; const int N=1e5+10,M=1e6+10,inf=2147483647; const ll INF=1e18+10,mod=2147493647; int main() { int n; while(~scanf("%d",&n)) { if(n==0) printf("1 "); else printf("6 "); } return 0; }
1003
如果做过HDU1222题估计会好很多,结论就是gcd(2*n-2,k)==1时,所有格子可以踩中
HDU1222是一个圈啦,这里不是,我们要看成一个圈,比如12321,我们取1232为循环,就是2*3-2(2*n-2)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <math.h> 5 #include <iostream> // C++头文件,C++完全兼容C 6 #include <algorithm> // C++头文件,C++完全兼容C 7 #include <time.h> 8 #define fre freopen("out.txt","w",stdout) //以文件代替控制台输入,比赛时很常用,能缩短输入测试样例的时间 9 #define INF 0x3f3f3f3f 10 #define inf 1e60 11 using namespace std; // C++头文件,C++完全兼容C 12 const int maxn = 200; 13 int a[maxn]; 14 int b[3]; 15 int ans,n,k; 16 17 int main() 18 { 19 while(cin>>n) 20 { 21 for(int i=2; i<=2*n; i++) 22 { 23 if(__gcd(2*n-2,i)==1) 24 { 25 cout<<i<<endl; 26 break; 27 } 28 } 29 } 30 31 return 0; 32 }
1004
我们想一想十进制怎么求末尾0,嗯嗯,当然是找被10整除的个数喽
这里情况一样的啦,我们就一直除以3,一直除以3,找被3整除的个数
#include <stdio.h> #define freout freopen("out.txt","w",stdout) #define frein freopen("in.txt","r",stdin) int main () { // frein; // freout; long long n; while(~scanf("%lld", &n)) { long long sum = 0; long long tmp = 3; while (n >= tmp) { sum += (n / tmp); tmp *= 3; } printf("%lld ", sum); } return 0; }
1005
大概知道了如果数组中只存在两种数字,必定是符合要求的
三种如何判断,最小的数字必须增加一个数,最大的数字必须减少一个数字,他们要和中间数字相同,那么是a[3]-a[2]==a[2]-a[1]的关系
我们需要做的就是去重计算出他的种类,排序判断
1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cmath> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<stack> 9 #include<cstring> 10 #include<vector> 11 #include<list> 12 #include<set> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define pi (4*atan(1.0)) 17 #define eps 1e-14 18 #define bug(x) cout<<"bug"<<x<<endl; 19 const int N=1e5+10,M=1e6+10,inf=2147483647; 20 const ll INF=1e18+10,mod=2147493647; 21 ll a[N]; 22 int main() 23 { 24 int n; 25 while(~scanf("%d",&n)) 26 { 27 for(int i=1; i<=n; i++) 28 scanf("%lld",&a[i]); 29 sort(a+1,a+1+n); 30 int cnt=unique(a+1,a+1+n)-a; 31 //cout<<cnt<<endl; 32 if(cnt>4) 33 printf("ecjtujxnu "); 34 else 35 { 36 if(cnt<=3) 37 printf("jxust "); 38 else if(a[3]-a[2]==a[2]-a[1]) 39 printf("jxust "); 40 else 41 printf("ecjtujxnu "); 42 } 43 } 44 return 0; 45 }
1006(原题http://qscoj.cn/problem/17/)
对每个数进行二分,就是这样,某位大牛的代码(当然你先得把最小值都弄好了)
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define ll long long #define pi (4*atan(1.0)) #define eps 1e-14 #define bug(x) cout<<"bug"<<x<<endl; const int N=1e5+10,M=1e6+10,inf=2147483647; const ll INF=1e18+10,mod=2147493647; int a[N]; int r[N]; int main() { int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); r[n]=a[n]; for(int i=n-1;i>=1;i--) r[i]=min(r[i+1],a[i]); for(int i=1;i<=n;i++) { int st=i+1; int en=n,ans=-1; while(st<=en) { int mid=(st+en)>>1; if(a[i]>r[mid]) { st=mid+1; ans=mid; } else en=mid-1; } if(ans==-1) printf("-1"); else printf("%d",ans-i-1); printf("%c",((i==n)?' ':' ')); } } return 0; }
实在不会还有这种的
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> #define MAX 200002 using namespace std; int a[MAX],ans[MAX]; vector<int> v,num; #define freout freopen("out.txt","w",stdout) #define frein freopen("in.txt","r",stdin) int main() { int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++) scanf("%d",&a[i]); v.clear(); num.clear(); for(int i=n-1;i>=0;i--){ if(v.size()==0 || v.back()>=a[i]){ v.push_back(a[i]); num.push_back(i); ans[i]=-1; }else{ int j = (lower_bound(v.rbegin(),v.rend(),a[i]) - v.rbegin()); // printf("%d %d ",a[i],j); j = (int)v.size() - j ; //printf("%d %d ",num[j+1],j); ans[i] = num[j] - i - 1; } } for(int i=0;i<n;i++){ if(i) printf(" "); printf("%d",ans[i]); } printf(" "); } return 0; }