超级闪光牛可乐
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int x,n,mx=-0x3f3f3f3f;
char food;
cin>>x>>n;
while(n--) {
char f;
int y;
cin>>f>>y;
if(y>mx) mx=y,food=f;
}
if(x/mx>1000) {
cout<<-1<<'\n';
} else {
int temp=x/mx+(x%mx!=0);
while(temp--) {
cout<<food;
}
}
return 0;
}
人列计算机
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
vector<string> v(5);
for(int i=0;i<5;i++) {
getline(cin,v[i]);
}
if(v[2][5]=='&') {
cout<<(v[1][0]-'0'&&v[3][0]-'0');
} else if(v[2][5]=='=') {
cout<<(v[1][0]-'0'||v[3][0]-'0');
} else {
cout<<(!(v[2][0]-'0'));
}
return 0;
}
时间管理大师
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int dt[]={1,3,5};
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int n;
cin>>n;
set<pii> clock;
while(n--) {
int x,y;
cin>>x>>y;
for(int t=0;t<3;t++) {
int nx=x,ny=y-dt[t];
if(ny<0) ny+=60,nx--;
clock.insert({nx,ny});
}
}
cout<<clock.size()<<'\n';
for(auto [x,y]:clock) {
cout<<x<<' '<<y<<'\n';
}
return 0;
}
我不是大富翁
考虑维护一个数组 f[i][j]
用来表示第 i 个回合并且Rabbit在第 j 个位置的操作数。
最开始时,需要将 f[0][0]
初始化为 1,其余为 0,对于每回合 i 的移动数 x ,都有
- 如果
f[i - 1][j - x]
为 i,那么f[i][j] = i + 1
- 如果
f[i - 1][j + x]
为 i,那么f[i][j] = i + 1
两者任意满足其一即可更新,最后判断 f[m][0]
是否等于 m + 1 即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int n,m;
cin>>n>>m;
vector<vector<int>> f(m+1,vector<int>(n));
f[0][0]=1;
for(int i=1;i<=m;i++) {
int x;
cin>>x;
x%=n; // 这里一定要除于 n
for(int j=0;j<n;j++) {
if(f[i-1][(j-x+n)%n]==i||f[i-1][(j+x+n)%n]==i)
f[i][j]=i+1;
}
}
if(f[m][0]==m+1) cout<<"Yes";
else cout<<"No";
return 0;
}
多重映射
大佬题解救我狗命
使用并查集来维护数组属于哪个集合,mp1[x]=y 表示 x 映射的集合为 y,mp2[y]=x 表示映射为 y 的集合为 x
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int pre[1000010];
int _find(int x)
{
return pre[x]==x?x:pre[x]=_find(pre[x]);
}
void _union(int x,int y)
{
pre[_find(x)]=_find(y);
}
void solve()
{
int n,m;
cin>>n>>m;
vector<int> a(n);
map<int,int> mp1,mp2; // x映射到的集合,映射到x的集合
for(int i=0;i<n;i++) {
cin>>a[i];
pre[a[i]]=a[i]; // 全部初始化可能会超时
mp1[a[i]]=a[i];
mp2[a[i]]=a[i];
}
while(m--) {
int x,y;
cin>>x>>y;
if(!mp2.count(x)||x==y) continue; // 没有映射到 x 的集合
if(!mp2.count(y)) { // 没有映射为 y 的集合
mp2[y]=mp2[x];
mp1[mp2[x]]=y; // 原映射为 x 的集合映射到 y
mp2.erase(x); // 没有映射为 x 的集合了
} else { // 存在映射为 y 的集合
_union(mp2[x],mp2[y]); // 将两个集合合并
mp1.erase(mp2[x]); // 映射为 x 的集合已经被合并了,将其删除
mp2.erase(x); // 删除映射为 x 的集合
}
}
for(auto temp:a) {
cout<<mp1[_find(temp)]<<' ';
}
cout<<'\n';
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
int t;
cin>>t;
while(t--) {
solve();
}
return 0;
}