1. 程式人生 > >2018個人PK賽#5

2018個人PK賽#5

集合 最大 int turn click cstring == sta codeforce

2018-01-20

A - Cut Ribbon

CodeForces - 189A 兩層循環 代碼如下: 技術分享圖片
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>

typedef long long ll;
using namespace std;
const int MOD=1e9+7; int main() { int n,a,b,c,maxx=0; scanf("%d%d%d%d",&n,&a,&b,&c); for(int i=0;i<=n/a;i++) for(int j=0;j<=n/b;j++) if((n-a*i-b*j)>=0&&(n-a*i-b*j)%c==0) { maxx=max(maxx,i+j+(n-a*i-b*j)/c); } printf(
"%d\n",maxx); return 0; }
View Code

B - s-palindrome

CodeForces - 691B

判斷該字符串是否是鏡像的,模擬 註意‘n’,‘m’並不鏡像

代碼如下:

技術分享圖片
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>

typedef 
long long ll; using namespace std; const int MOD=1e9+7; char str[]={A,H,I,M,O,o,T,U,V,v,W,w,X,x,Y}; const int N=1e3+7; char ch[N]; int path(char c) { for(int i=0;i<15;i++) if(c==str[i]) return 1; return 0; } int lp(char c,char d) { if(c==d&&d==b) return 1; if(c==b&&d==d) return 1; if(c==p&&d==q) return 1; if(c==q&&d==p) return 1; return 0; } int lk() { int l=0,r=strlen(ch)-1; while(l<=r) { if((ch[l]==ch[r]&&path(ch[l]))||lp(ch[l],ch[r])) { l++;r--; } else return 0; } return 1; } int main() { scanf("%s",ch); if(lk()) puts("TAK"); else puts("NIE"); return 0; }
View Code

C - Mahmoud and Ehab and the bipartiteness

CodeForces - 862B 額 題意很重要 就是這個圖的點能否被切分成兩個集合,同一個集合中的點,不能有邊相連。所以最後所有點都會被劃分到兩個集合內。 找出集合的大小m0,m1,邊數就等於m0*m1, 題中有n-1邊是原有的,答案即為m0*m1-(n-1) dfs 碼如下: 技術分享圖片
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;

typedef long long ll;
const int N=1e5+7;
vector<int>edge[N];
int vis[N];
ll m0=0,m1=0;
void dfs(int n,int flag)
{
    if(flag)
        m0++;
    else
        m1++;
    vis[n]=1;
    for(int i=0;i<edge[n].size();i++)
        if(!vis[edge[n][i]])
            dfs(edge[n][i],!flag);
}
int main()
{
    int n,u,v;
    cin>>n;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n-1;i++)
    {
        cin>>u>>v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    dfs(1,0);
    cout<<m0*m1-(n-1)<<endl;
    return 0;
}
View Code

D - Dasha and Very Difficult Problem

CodeForces - 761D 題意: 已知a序列,以及c序列的大小的排名, c[i]=b[i]-a[i],且a[i],b[i]均是[l-r]範圍內,求b序列,若不存在輸出-1 操作順序是從c序列的小到大,首先找到一個最小值 minn=(l-a[vis[0]]),然後下一個數為minn+1 ,b[i]=minn+1+a[i],若b[i]不在[l-r]範圍內結束,輸出-1 ,否則 b[i]=max(b[i],l) 繼續操作 代碼如下: 技術分享圖片
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;

typedef long long ll;
const int N=1e5+7;
const int INF=1e9+7;
int a[N],b[N];
int vis[N];
int main()
{
    int n,l,r,p;
    scanf("%d%d%d",&n,&l,&r);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&p);
        vis[p-1]=i;
    }
    int minn=-INF,flag=0;
    for(int i=0;i<n;i++)
    {

        if(i==0)
        {
            b[vis[i]]=l;
            minn=l-a[vis[i]];
        }
        else
        {
            int x=minn+1+a[vis[i]];
            if(x>r)
            {
                flag=1;
                break;
            }
            else
                b[vis[i]]=max(l,x);
            minn=b[vis[i]]-a[vis[i]];
        }
    }
    if(flag)
        puts("-1");
    else
    {
        for(int i=0;i<n;i++)
            printf("%d%c",b[i],i==n-1?\n: );
    }
    return 0;
}
View Code

E - Energy exchange

CodeForces - 68B 題意:
給n個能源箱,問最後所有能量箱都為一樣的最大值
能量轉移會損失能量 二分 能源的範圍[l-r] 代碼如下:
技術分享圖片
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
const int N=1e4+7;
int main()
{
    double l=1000,r=0;
    int n,k;
    double a[N];
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
    {
        scanf("%lf",&a[i]);
        l=min(l,a[i]);
        r=max(r,a[i]);
    }
    while(l+1e-9<=r)
    {
        double mid=(l+r)*1.0/2.0;
        double ans=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]>mid)
            {
                ans+=mid;
                ans+=(a[i]-mid)*(100-k)*1.0/100.0;
            }
            else
                ans+=a[i];
        }
        if(ans>n*mid)
            l=mid;
        else
            r=mid;
    }
    printf("%.9lf\n",l);
    return 0;
}
View Code

2018個人PK賽#5