把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

fxtoi 猜拳问题

题面传送门
对于这道题,我们很容易想到一个办法:搜索!你试试看
可是看到对于所有数据 \(n\leq4000000000\)应该就怂了。过不去!
细心观察 如果剪刀石头布三者都有,那么就会决不出胜负。
不不不不 还有一样我们没考虑 :每个人出的都一样!
那加个三不就好了!

#include<bits/stdc++.h>
using namespace std;
int n,t;
long long ans;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n)
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                for(int k=1;k<=n;k++){
                    if(i+j+k==n) ans++;
                }
            }
        }
        printf("%lld",ans);
        ans=0;
    }
    return 0;
}

我们发现,有些循环是不必要的 于是我把他改了改

#include<bits/stdc++.h>
using namespace std;
int n,t;
long long ans;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n)
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n-i-1;j++){
                for(int k=1;k<=n-i-j;k++){
                    if(i+j+k==n) ans++;
                }
            }
        }
        printf("%lld",ans);
        ans=0;
    }
    return 0;
}

但是,我仔细看了看又发现,可循环其实是没有必要的,因为我们可以控制\(j\)来去掉\(k\)

#include<bits/stdc++.h>
using namespace std;
int n,t;
long long ans;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n)
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n-i-1;j++){
                ans++;
            }
        }
        printf("%lld",ans);
        ans=0;
    }
    return 0;
}

然后我又发现(发现真多) j的循环层数是固定的,于是可以再改改:

#include<bits/stdc++.h>
using namespace std;
int n,t;
long long ans;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n)
        for(int i=1;i<=n;i++)ans+=n-i-1;
        printf("%lld",ans);
        ans=0;
    }
    return 0;
}

似乎很快 ,但\(O(NT)\)的复杂度还是过不去。似乎要变成\(O(T)\)\(O(Tlog^2n)\)才行。
细看,恍然大悟,找到了\(O(T)\)的方法:\(ans\)加的是等差数列!
\(AC\)代码:

#include<bits/stdc++.h>
using namespace std;
unsigned long long n,ans,t;
int main(){
    //freopen("a15.in","r",stdin);
    //freopen("a15.out","w",stdout);
    cin>>t;
    while(t--){
        scanf("%lld",&n);
        printf("%lld\n",(n*n+3*n)/2+7);
    }
    return 0;
}

对了,有件事忘说了
\(n\)要加\(3\)
去好好看看题目,题目说什么?
\(wangshengjun33\)\(275307894a\)\(A_rsj\)怎么办呢?
本出题人的一个小得意之处。

posted @ 2020-03-16 12:53  275307894a  阅读(49)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end