AtCoder Regular Contest 079

C题,刚开始以为遍历整个树,后来发现二重循环判断就行了

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
 
using namespace std;
 
const double g=10.0,eps=1e-7;
const int N=200000+10,maxn=500+100,inf=0x3f3f3f;
 
vector<int>v[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    for(int i=0;i<v[1].size();i++)
    {
        int u=v[1][i];
        for(int j=0;j<v[u].size();j++)
        {
            if(v[u][j]==n)
            {
                cout<<"POSSIBLE"<<endl;
                return 0;
            }
        }
    }
    cout<<"IMPOSSIBLE"<<endl;
    return 0;
}
/********************
 
********************/
C

D题,根据数据范围可以看出n必须是50,否则a会大于1e16+1000,先枚举1到50的过程,然后加上去就行了

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
 
using namespace std;
 
const double g=10.0,eps=1e-7;
const int N=100+10,maxn=500+100,inf=0x3f3f3f;
 
ll ans[N][N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    ll k;
    cin>>k;
    cout<<50<<endl;
    memset(ans,0,sizeof ans);
    for(int i=1;i<50;i++)
    {
        for(int j=0;j<50;j++)
        {
            if(j==i)ans[i][j]=ans[i-1][j]+50;
            else ans[i][j]=ans[i-1][j]-1;
        }
    }
    ll s=k/50,p=k%50;
    for(int i=0;i<50;i++)
        cout<<ans[p][i]+49ll+s<<(i==49?'
':' ');
    return 0;
}
/********************
 
********************/
D

E题,直接每次把a[i]减到n以下(刚开始以为会超时就没写。。。)

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
 
using namespace std;
 
const double g=10.0,eps=1e-7;
const int N=1500+10,maxn=500+100,inf=0x3f3f3f;
 
ll a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    ll n,ans=0;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    while(1){
        ll maxx=-1e17,id;
        for(int i=0;i<n;i++)
        {
            if(a[i]>maxx)
            {
                maxx=a[i];
                id=i;
            }
        }
        if(maxx<n)break;
        for(int i=0;i<n;i++)
        {
            if(i==id)a[i]%=n;
            else a[i]+=maxx/n;
        }
        ans+=maxx/n;
    }
    cout<<ans<<endl;
    return 0;
}
/*********************
10
1000 193 256 777 0 1 1192 1234567891011 48 425
*********************/
E
原文地址:https://www.cnblogs.com/acjiumeng/p/7258524.html