2023年中国传媒大学程序设计大赛(同步赛)
根据输入打出相对应个数的0即可
#include
using namespace std;
int n;
int main()
{
cin >> n;
if(n == 0) cout << 0 ;
else
{
cout << "0.";
for(int i = 1; i <= n; i ++) cout << 0;
}
return 0;
}
计算每天吃的食物饱腹感的值,判断是否满足要求并计数即可
#include
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, k, s;
int a[N];
signed main()
{
cin >> n >> k >> s;
for(int i = 1; i <= s; i ++)
{
int u, v;
cin >> u >> v;
a[u] += v;
}
int ans = 0;
for(int i = 1; i <= n; i ++)
if(a[i] < k) ans ++;
cout << ans << "\n";
}
统计可以获得的各类能量值,判断是否可以满足所有咒语的要求,要额外注意无色费用的情况
#include
#define int long long
using namespace std;
int a[10], b[10];
int n, m, k, t;
void init()
{
for(int i = 0; i < 10; i ++) a[i] = 0, b[i] = 0;
}
void solve()
{
init();
cin >> n;
for(int i = 1; i <= n; i ++)
{
char c;
cin >> c;
if(c == 'W') a[1] ++;
if(c == 'U') a[2] ++;
if(c == 'B') a[3] ++;
if(c == 'G') a[4] ++;
if(c == 'R') a[5]++;
}
cin >> m;
for(int i = 1; i <= m; i ++)
{
string s;
cin >> s;
for(int i = 0;i < s.size();i++)
{
if(s[i] == 'W') b[1] ++;
if(s[i] == 'U') b[2] ++;
if(s[i] == 'B')b[3] ++;
if(s[i] == 'G') b[4] ++;
if(s[i] == 'R') b[5] ++;
if(s[i] == 'O')b[6] ++;
}
}
int f = 1;
for(int i = 1;i <= 5;i++)
{
if(a[i] >= b[i])
{
a[i] = a[i]-b[i];
}
else if(a[i] < b[i])
{
f = 0;
puts("NO");
break;
}
}
if(f)
{
int sum = 0;
for(int i = 1;i <= 5;i++) sum += a[i];
if(sum >= b[6]) puts("YES");
else puts("NO");
}
}
signed main()
{
cin >> t;
while(t--) solve();
return 0;
}
至少拿出多少只可以保证配对也就是最多可以拿出多少只不配对,可以通过拿不同图案,每种图案的贡献值取左右脚之中的较大者,对于*
类,最多选一只。统计过程中顺便判断是否能配对。
#include
#define int long long
#define x first
#define y second
using namespace std;
const int N = 1e5 + 10;
int n, m, k, t;
map<int, int>q;
signed main()
{
cin >> n;
bool f = false;
for(int i = 0; i < n; i ++)
{
int u, v;
char c;
cin >> u >> c >> v;
if(c == '*')
{
if(v >= 2) f = true;
if(q.count(u)) f = true;
q[u] = max(q[u], (int)1);
}
else
{
if(q.count(u)) f = true;
q[u] = max(q[u], v);
}
}
if(f)
{
int ans = 0;
for(auto &[l, r] : q) ans += r;
cout << ans + 1 << "\n";
}
else puts("-1");
}
可以将3*3矩阵抽象成为9位的二进制数,01表示状态,而翻转操作就相当于将对应位置上的数与1进行一次异或操作。
可以枚举出对于9个二进制位进行操作的所有状态,找到某在一种状态下操作的最小值。
#include
#define int long long
using namespace std;
const int N = 5;
typedef pair<int, int> PII;
int n, m, k, t;
int c[N][N], a[N][N];
vector<PII>ans;
int dx[6] = {0, 1, 0, -1, 0}, dy[6] = {1, 0, -1, 0, 0};
int get(int a, int b)
{
return a * 3 + b;
}
signed main()
{
int state = 0;
for(int i = 0; i < 3; i ++)
{
for(int j = 0; j < 3; j ++)
{
cin >> a[i][j];
if(a[i][j] == 1)
state += (1 << get(i, j));
}
}
for(int i = 0; i <3; i ++)
{
for(int j = 0; j < 3; j ++)
{
for(int k = 0; k < 5; k ++)
{
int xx = i + dx[k], yy = j + dy[k];
if(xx >= 0 && xx < 3 && yy >= 0 && yy < 3)
{
c[i][j] += (1 << get(xx, yy));
//cout << xx << "--" << yy << "\n";
}
}
//cout << c[i][j] << "\n";
}
}
int ans = 0, tem = 0;
for(int i = 0; i < (1 << 9); i++)
{
int now = state;
tem = 0;
for(int j = 0; j < 9; j ++)
{
if(i >> j & 1)
{
int x = j / 3, y = j % 3;
now ^= c[x][y];
tem ++;
}
}
if(!now && (ans == 0 || ans > tem)) ans = tem;
}
cout << ans << "\n";
return 0;
}