Codeforces Round #221 (Div. 2)

u010660276發表於2014-01-04

B - I.O.U.

如果A欠Bx元,那麼A擁有的錢數-x,b擁有的錢數+x;

就這樣處理完所有的欠錢關係,最後如果A擁有的錢數為正數y,那麼說明最優的結果,除A以外的人應該共給A y錢。

剛開始用floyed穿閉包做了一下,不對,然後看了一下別人的,秒懂。。。

下面是程式碼:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
char str[1010001];
int main()
{
    int n,m,i,a,b,c;
    int num[1001];
    while(~scanf("%d%d",&n,&m))
    {
        memset(num,0,sizeof(num));
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            num[a]-=c;
            num[b]+=c;
        }
        LL sum=0;
        for(i=1;i<=n;i++)
        {
            if(num[i]>0)sum+=num[i];
        }
        cout<<sum<<endl;
    }
    return 0;
}
C:

1689四個數字組成的所有組合對7取餘可以得到0~6中的所有數字。

輸入一個字串,從這個字串中挑出一個1,6,8,9來。

然後對剩下的數對7取餘(大整數取餘),然後加上1689四個數字組成的相應的序列。

比如說輸入123456789。

123456789的其中一個結果為234571869。

234560000+1869=234571689

234560000%7==0;

1869%7==0;

那麼234571689%7==0;

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;

char str[1100000];
int cnt[10];
int r[10];
int main() {
//    freopen("in.txt","r",stdin);
    memset(r,0,sizeof(r));
    memset(cnt,0,sizeof(cnt));
    char tar[10]="1689";
    do {
        int num=atoi(tar);
        r[num%7]=num;
    } while (next_permutation(tar,tar+4));
    scanf("%s",str);
    for (int i=0;str[i];i++) cnt[str[i]-'0']++;
    cnt[1]--,cnt[6]--,cnt[8]--,cnt[9]--;
    int remain=0;
    for (int i=9;i>=1;i--) {
        while (cnt[i]>0) {
            putchar(i+'0');
            remain=(remain*10+i)%7;
            cnt[i]--;
        }
    }
    for (int i=0;i<7;i++) {
        if ((remain*10000+r[i])%7==0) {printf("%d",r[i]);break;}
    }
    while (cnt[0]>0) putchar('0'),cnt[0]--;
    puts("");
    return 0;
}



相關文章