山东省第七届ACM程序设计竞赛

sdutoj 3560 - 3570 http://acm.sdut.edu.cn/sdutoj/problem.php?page=26

A

水题

#include  
#include  
#define mem(a,x) memset(a,x,sizeof(a))  
using namespace std;  
typedef long long ll;  
const int N = 100010;int a[5];  
  
int main(){  
    int t;  
    scanf("%d",&t);  
    while(t--){  
        int a,b;scanf("%d%d",&a,&b);  
        printf("%d\n",a/b + (a%b!=0));  
    }  
    return 0;  
}  

B

二分,每次在FIb中找与当前所需数最接近的。。

//好吧,我们当时就是这么做的
#include  
#include  
#include  
#include  
#define mem(a,x) memset(a,x,sizeof(a))  
using namespace std;  
typedef long long ll;  
const int N = 100010;int a[5];  
char s[50];  
int f[111];  
int ans[111];  
int main(){  
    int t;  
    scanf("%d",&t);  
    f[0] = 1; f[1] = 2;  
    int r  =0;  
    for(int i=2;;i++){  
        f[i] = f[i-1] + f[i-2];  
        if(f[i-2] + f[i-1] > 1e9) {  
           r = i;  
           break;  
        }  
  
    }  
    //cout<

C,简单的最短路。

让你找能否从节点n+1连通到节点0,不能输出-1。如果能,则找出从节点n+1到节点0最短的那条通路,输出这条通路中与0相连的节点序号。如果有多条通路,输出节点序号最小的那个,如果n+1节点与0节点直接相连,并且路径也是最短,则输出0;

#include  
#include  
#include  
#include  
#include  
#define mem(a,x) memset(a,x,sizeof(a))  
#define INF 0x3f3f3f3f  
using namespace std;  
typedef long long ll;  
const int MAXN = 2020;  
int n,m;  
struct node{  
    int v, len;  
    bool operator < (const node & t) const{  
        return len > t.len;  
    }  
    node(int v = 0, int len = 0):v(v), len(len){}  
}tp[MAXN];  
vector G[MAXN];  
bool vis[MAXN];  
int dis[MAXN];  
void Init(int n){  
    for(int i = 0; i <= n; i++){  
        vis[i] = false;  
        G[i].clear();  
        dis[i] = INF;  
    }  
}  
int dijstra_heap(int s){  
    priority_queueQ;  
    dis[s] = 0;  
    //vis[s] = 1;  
    Q.push(node(s,0));  
    while(!Q.empty()){  
        node now = Q.top();  
        Q.pop();  
        int v = now.v;  
        if(vis[v]) continue;  
        vis[v] = true;  
        for(int i=0;i
D

占坑

E

水题。

#include  
#include  
#include  
#include  
#define mem(a,x) memset(a,x,sizeof(a))  
using namespace std;  
typedef long long ll;  
const int N = 100010;int a[5];  
char s[50];  
int f[111];  
int ans[111];  
char G[111][111];  
int main(){  
    int t;  
    scanf("%d",&t);  
    while(t--){  
        int n,m;scanf("%d%d",&n,&m);  
        mem(G,'.');  
        for(int i=1;i<=n;i++){  
            for(int j=1;j<=m;j++)  
                scanf(" %c",&G[i][j]);  
        }  
        int ans = 0;  
        for(int i=0;i<=n+1;i++){  
            for(int j=0;j<=m+1;j++){  
                if(G[i][j] =='.'){  
                    int l = 0;  
                    if(i-1>=0 && G[i-1][j] =='#') l++;  
                    if(j-1>=0 && G[i][j-1] =='#') l++;  
                    if(i


F

占坑

G

规律题,用NIM的方法(3个数异或)打出表来发现了规律。

奇数都是0,偶数的话发现都是1,4,13,40,,3n+1. 转换成二进制后发现与二进制中1的个数有关。

2个1,是1,3个1是4,4个1是13.。。

f[n] = f[n-1]*3 + 1

f[n-1]*3 = f[n-2]*9 + 3

f[n] = f[n-2]*9 + (1+3)

f[n] = f[n-3]*27 + (1 + 3 + 9)

这样推下去,得出

f[n] = f[1] *(3^(n-1)) + (1-3^(n-1))/(1-3)   。。。 (用到了等比数列求和公式 Sn = a1(1-q^n))/(1-q))

化简一下 f[n] = (3^n - 1)/2   (这里的n是二进制中1的个数-1)


这里学到一个gcc编译器的内建函数,__builtin_popcount(x)

直接统计整数x转换成2进制中有多少1。

#include  
#include  
#include  
#include  
#include  
#include  
#define mem(a,x) memset(a,x,sizeof(a))  
#define INF 0x3f3f3f3f  
using namespace std;  
typedef long long ll;  
const int MAXN = 2020;  
int main(){  
    int T;scanf("%d",&T);  
    while(T--){  
        ll n;scanf("%lld",&n);  
        if(n < 6 || n&1) printf("0\n");  
        else{  
            int ans = __builtin_popcount(n);  
            if(ans <=1)printf("0\n");  
            else{  
                ans--;  
                printf("%lld\n",((ll)pow(3,ans)-1)/2);  
            }  
            //cout<

H

//学习别人的做法,自己的找不出错了。。不过这个代码更省内存吧

#include
using namespace std;
const int M =11111;
struct node{
    int l,r;
}e[M];
int top;
char s[M];
char c[M][M/10];
char op[M];
int main(){
    int T;scanf("%d",&T);
    while(T--){
        memset(s,0,sizeof(s));
        int pos = 0, top = 0;
        scanf("%s",op);
        while(true){
            scanf("%s",op);
            int len = strlen(op);
            int num = 0, i = 0;
            for(i = 0;i < len ; i++){
                if(op[i] != '[') c[top][i] = op[i];
                else break;
            }
            c[top][i] = '\0';
            for(i++;i

自己wa的代码,求指出啊~

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
map mp;
mapmp2;
mapmp3;

struct node{
    string name;
    int len;
    int id;
};
int main(){
    int T;scanf("%d",&T);

    while(T--){
        mp.clear();        mp2.clear(); mp3.clear();
        getchar();
        string a;
        getline(cin,a);
        int len = a.length();
        node no[10100]; int cnt  =0 ;
        for(int i=0;i>ord;
            if(ord == "return"){
                cin>>num; break;
            }
            else if (ord == "gets"){
                cin>>num;
                getchar();
                getline(cin,str);
                string tmp  = str.substr(0,no[mp2[num]].len);
                mp[num] = tmp;
                if(str.length() >= no[mp2[num]].len)
                    mp3[num] = 1;
                else
                    mp3[num] = 0;
            }
            else if(ord == "cout"){
                cin>>num;
                if(mp[num] == ""){
                    cout<

I

占坑

J

阅读理解题,对于玩过炉石传说游戏的来说就是秒A了(果然ACMer要什么都懂。。)

#include  
#include  
#include  
#define mem(a,x) memset(a,x,sizeof(a))  
using namespace std;  
typedef long long ll;  
const int N = 100010;int a[5];  
char s[50];  
int main(){  
    int t;  
    scanf("%d",&t);  
    while(t--){  
        int n,hp; scanf("%d%d",&n,&hp);  
        getchar();  
        int C=0,M=0,O=0,B=0;  
        for(int i=0;i=0){  
            printf("Mrghllghghllghg!\n");  
        }  
        else  
            printf("Tell you a joke, the execution of Paladin.\n");  
    }  
    return 0;  
}  

K

字符串翻转,经典水题

#include  
#include  
#include  
#define mem(a,x) memset(a,x,sizeof(a))  
using namespace std;  
typedef long long ll;  
const int N = 100010;int a[5];  
char s[10100];  
int main(){  
    int t;  
    scanf("%d",&t);  
  
    getchar();  
    while(t--){  
        gets(s);  
        int len = strlen(s);  
        //cout<=l;j--) printf("%c",s[j]);  
                if(i != len)  
                    printf(" ");  
                else  
                    printf("\n");  
                l = i+1;  
                //cout<<" "<


你可能感兴趣的:(山东省ACM程序设计竞赛)