Codeforces Round #260 (Div. 2)

OpenSoucre發表於2014-08-10

A. Laptops

題目意思:

  給定n臺電腦,第i臺電腦的價格是ai ,質量是b,問是否存在一臺電腦價格比某臺電腦價格底,但質量確比某臺電腦的質量高,即是否存在a< a且 b> b?

解題思路:

  這題一定要看題目,a都是1~n的不同數,b也是1~n的不同數,此題只需要判斷a是否等於bi ,如果a!= bi 的話,則輸出“Happy Alex”,如果所有的ai  == bi 則輸出“Poor Alex”

  證明:先將a按照從小到大排序,當i<j時a< aj

    假設不存在a< a且 b> bj ,即對所有的bi <= b

    又不b的各個數都不同,所有b也應該從1到n從小到大排序,即此時ai  == bi ,

    即當ai  == bi 時才輸出“Poor Alex”

    否則肯定輸出 “Happy Alex”

#include <iostream>
using namespace std;

int main(){
    int n,a,b;
    cin >> n;
    bool flag = false;
    for(int i = 0; i < n; ++i){
        cin >> a >> b;
        if(a!=b) flag=true;
    }
    if(flag) cout<<"Happy Alex"<<endl;
    else cout<<"Poor Alex"<<endl;
}
View Code

B. Fedya and Maths

題目的意思:

  給定一個非常大的n,求(1^n + 2^n + 3^n + 4^nmod 5

解題思路是:

  通過將前面幾個數打出來,然後找規律,發現當n是4的倍數時輸出4,其他輸出的時0,所以此題判斷n是不是4的倍數。

  第一種方法是將n當成一個字串,然後判斷n是不是能被4整除

#include <iostream>
#include <string>
using namespace std;

int main(){
    string n;
    cin >>n;
    int left = 0;
    for(int i = 0 ; i < n.size(); ++i){
        left=(left*10+(n[i]-'0'))%4;
    }
    if(left) cout<<0<<endl;
    else cout<<4<<endl;
}
View Code

  第二種方法是,由於大數會溢位,根據一個數表示成二進位制,當溢位時,擷取溢位的位,所以地位的二進位制保持不變

#include <stdio.h>
using namespace std;

int main(){
    long long n;
    scanf("%I64d",&n);
    if(n%4 == 0) printf("4\n");
    else printf("0\n");
}
View Code

C. Boredom

題目的意思:

  給定一個含有n個整數的陣列,你可以進行多次操作,每次操作從陣列選一個數ak,然後將其刪除,然後刪除與a-1和a+1相等的數,則可以得到a分,求進行多次操作後得到的最多的分

解題思路:

  利用動規,設dp[i]表示到達第i個數得到的最大的分, cnt[i] 表示第i個數的個數

  則dp[i] = max(dp[i-1], dp[i-2]+cnt[i]*i) , 2≤i≤n

    dp[1] = cnt[1];

    dp[0] = 0

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int n,a;
    cin >> n;
    int cnt[100001]={0};
    for(int i = 0 ; i < n;++ i){
        cin>>a;cnt[a]++;
    }
    long long dp[100001]={0};
    dp[0] = 0,dp[1]=cnt[1];
    for(int i = 2; i <= 100000;++ i){
        dp[i] = max(dp[i-1],dp[i-2]+(long long)cnt[i]*i);
    }
    cout<<dp[100000]<<endl;
}
View Code

 

相關文章