1. 程式人生 > >CCF CSP第十一次認證考試 20170917

CCF CSP第十一次認證考試 20170917

第一題: 買醬油,買五瓶送兩瓶,買三瓶送一瓶。10元/瓶。給出錢數,問最多能買多少瓶醬油。

第二題:教師取放鑰匙,結構體排序,過載運算子。

第三題:檔案操作,字串處理,查詢。

第四題:有向圖的搜尋。能達到點v的點數 + 點v可達到的點數 == 總點數n - 1。詢問有多少個這樣的點。暴力深搜每個點,記錄可達資訊

第五題:聽說特判1能得八十分。用樹狀陣列+特判1優化就滿分了。好像還可以優雅地暴力解題,分塊+莫隊。但我不會。

第三題把讀到的資訊去掉所有空格,就是一個串。對於要查詢的字串例如address,變成 鍵"address": 這樣就不會和值中的address重了。只得了60分這題。 

第一題:(100)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <cmath>
using namespace std;
int main()
{
	//ios::sync_with_stdio(false);
	int n;
	while(~scanf("%d", &n)) {
		n /= 10;
		int cnt = (n / 5) * 7;
		n %= 5;
		cnt += (n / 3) * 4;
		n %= 3;
		cnt += n;
		printf("%d\n", cnt);
	}
	
	return 0;
}

第二題:(100)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <cmath>
using namespace std;
const int N = 1007;
struct Node {
	int id, t, fg; //t時間點, fg: 0還鑰匙,1取鑰匙 
	Node(int id = 0, int t = 0, int fg = 0):id(id), t(t), fg(fg){}
	bool operator < (const Node &tmp) const {
		return t == tmp.t ? (fg == tmp.fg ? id < tmp.id : fg < tmp.fg) : t < tmp.t;
	}
}a[N << 1];
int v[N];
int main()
{
	//ios::sync_with_stdio(false);
	int n, k;
	while(~scanf("%d%d", &n, &k)) {
		int id, st, len, cur = 0;
		for(int i = 1; i <= k; ++i) {
			scanf("%d%d%d", &id, &st, &len);
			a[cur++] = Node(id, st, 1);
			a[cur++] = Node(id, st + len, 0);
		}
		for (int i = 1; i <= n; ++i) v[i] = i;
		sort(a, a + cur);
//		for (int i = 0; i < cur; ++i) {
//			printf("%d %d %d\n", a[i].t, a[i].id, a[i].fg);
//		}
		for (int i = 0; i < cur; ++i) {
			if(a[i].fg == 1) {
				for (int pos = 1; pos <= n; ++pos) if(v[pos] == a[i].id) {
					 v[pos] = 0; 
					 break;
				}
			}
			else {
				for (int pos = 1; pos <= n; ++pos) if(v[pos] == 0) {
					v[pos] = a[i].id;
					break;
				}
			}
		}
		for(int i = 1; i <= n; ++i) {
			printf("%d%c", v[i], " \n"[i==n]);
		}
	}
	
	return 0;
}

第三題:(60)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <cmath>
using namespace std;
const int N = 107;
string dup(string str) {
	for (string::iterator it = str.begin(); it != str.end(); ++it) {
		if(*it == ' ') str.erase(it--);
	}
	return str;
}
string add(string str) {
	string res = "";
	int len = str.length();
	for (int i = 0; i < str.length(); ++i) {
		if(str[i] == '\\' || str[i] == '\"') res += '\\';
		res += str[i];		
	}
	return res;
}
int main()
{
	ios::sync_with_stdio(false);
	int n, m;
	while(cin >> n >> m) {
		string tmp, s = "", t;
		cin.get();
		for (int i = 0; i < n; ++i) {
			getline(cin, tmp); s += tmp;
		}
		s = dup(s); //cout << s << endl << s.length() << endl;
		int len = s.length();
		while(m-- > 0) {
			cin >> t; 
			t = add(t);
		///*	
			t = '\"' + dup(t) + "\":";// cout << t << endl;
			string res = "";
			int found = (int) s.find(t), i;
			if(found == -1) {cout << "NOTEXIST" << endl;}
			else {
				found += t.length();
				//cout << found << " " << s[found] << endl;			
				for (i = found; i < len; ++i) {
					if(s[i] == '}' && i != len - 1) {
						found = (int)s.find(t, i);
						//cout << i << " " << s[i] << endl;
						if(found == -1) {cout << "NOTEXIST" << endl; }
						else {
							found += t.length() + 1;
							if(s[found] == '{') cout << "OBJECT" << endl;
							else {   	
								cout << "STRING ";
								while(s[found] != '\"') cout << s[found++];
								cout << endl;//error
							}
						} 
						break;
					}
					else if(s[i] == '{'){
						break;
					}					
				}
				if(i >= len || s[i] == '{') {
					//cout << found << " " << s[found] << endl;
					if(s[found] == '{') cout << "OBJECT" << endl;
					else {
						cout << "STRING ";
						for(int i= found + 1; i < len; ++i) {
							if(s[i] == '\\') cout << s[++i];
							else if(s[i] == '\"') break;
							else cout << s[i];
						}
						cout << endl;
					}
				} 
//				else {
//					cout << i << " " << s[i] << endl;
//				}
			}
		//*/
		}
	}
	
	return 0;
}

第四題:(100)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1007;
vector<int> e[N]; //動態陣列鄰接表存圖
bool mp[N][N]; //mp[i][j] i 到 j是否通 
bool vis[N];
void dfs(int u, int cur) {
	vis[u] = 1;
	mp[u][cur] = mp[cur][u] = 1;
	for (int i = e[u].size() - 1; i >= 0; --i) {
		int v = e[u][i];
		if (!vis[v])
			dfs(v, cur);
	}
}
int main()
{
	int n, m, cnt = 0;
	scanf("%d%d", &n, &m);
	for (int i = 0; i<m; ++i) {
		int u, v;
		scanf("%d%d", &u, &v);
		e[u].push_back(v);
	}
	for (int i = 1; i <= n; ++i) {
		memset(vis, 0, sizeof vis);
		dfs(i, i);
	}
	for (int i = 1; i <= n; ++i) {
		bool fg = true;;
		for (int j = 1; j <= n; ++j) {
			if (mp[i][j] == 0) {
				fg = false;
				break;
			}
		}
		cnt += fg;
	}
	printf("%d", cnt);

	return 0;
}

第五題:

#include <cstdio>
#include <cstring>

using namespace std;
const int N = 1e6 + 7;
typedef long long LL;
LL bit[N];
int n, m, a[N];
inline int lowbit(int x) {
    return x & -x;
}
void add(int pos, int val) {
    for (int i = pos; i <= n; i += lowbit(i))
        bit[i] += val;
}
LL sum(int x) {
    LL res = 0;
    for (int i = x; i > 0; i -= lowbit(i)) {
        res += bit[i];
    }
    return res;
}

int main()
{
    while(~scanf("%d%d", &n, &m)) {
        memset(bit, 0, sizeof bit);
        for (int i = 1; i <= n; ++i) {
            scanf("%d", a + i);
            add(i, a[i]);
        }
        while(m-- > 0) {
            int opt, l, r, val;
            scanf("%d", &opt);
            if(opt == 1) {
                scanf("%d%d%d", &l, &r, &val);
                if(val == 1) continue; //雖有整數都是1的倍數,優化
                for(int i = l; i <= r; ++i) if(a[i] >= val && a[i] % val == 0) {
                        add(i,a[i] / val - a[i]);
                        a[i] /= val;
                }
            }
            else if(opt == 2) {
                scanf("%d%d", &l, &r);
                printf("%lld\n", sum(r) - sum(l - 1));
            }
        }
    }

    return 0;
}