江西理工大学南昌校区cool code竞赛

无耻的复制大佬的代码

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;
}
原文地址:https://www.cnblogs.com/yinghualuowu/p/6506040.html