CCF CSP第十一次認證考試 20170917
阿新 • • 發佈:2019-01-11
第一題: 買醬油,買五瓶送兩瓶,買三瓶送一瓶。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;
}