A. Finding Sasuke
n是偶数,输出相邻两个交换一个变负就可以了
#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
int T;
int n;
int a[maxn];
int main(){
cin>>T;
while(T--){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i+=2){
printf("%d %d%c",a[i+1],-a[i],(i==n-2)?'\n':' ');
}
}
}
B. A New Technique
数字没重复就直接通过两次输入的矩阵记录行列位置就可以了
#include <bits/stdc++.h>
using namespace std;
const int maxn=510;
int T;
int n,m;
int row[maxn*maxn];
int col[maxn*maxn];
int g[maxn][maxn];
int main(){
cin>>T;
int x;
while(T--){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>x;
col[x]=j;
}
}
for(int j=0;j<m;j++){
for(int i=0;i<n;i++){
cin>>x;
row[x]=i;
}
}
for(int i=1;i<=n*m;i++){
g[row[i]][col[i]]=i;
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d%c",g[i][j],(j==m-1)?'\n':' ');
}
}
}
}
C. Perform Easily
暴力要么爆空间要么爆时间,看了题解才发现可以用set贪心
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n;
int a[10];
int b[maxn];
set<pair<int,int>>s;
int main(){
for(int i=1;i<=6;i++)
cin>>a[i];
sort(a+1,a+7);
cin>>n;
for(int i=1;i<=n;i++){
cin>>b[i];
}
sort(b+1,b+n+1);
int id[maxn];
for(int i=1;i<=n;i++){
id[i]=6;
s.insert(make_pair(b[i]-a[id[i]],i));
}
int ans=(*s.rbegin()).first-(s.begin())->first;
set<pair<int,int>>::iterator it;
while(1){
it=s.begin();
int i=it->second;
s.erase(it);
if(id[i]==1)
break;
id[i]--;
s.insert({b[i]-a[id[i]],i});
ans=min(ans,(*s.rbegin()).first-s.begin()->first);
}
cout<<ans<<endl;
}
D. Shurikens
倒叙模拟,看了别人的题解发现用优先队列更好一些
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int pre[maxn],cnt=0;
stack<int>st;
struct P{
char op;
int num;
}shu[maxn];
int main()
{
int n;
cin>>n;
for(int i=1;i<=2*n;i++){
char s;
int num;
cin>>s;
if(s=='+'){
shu[i].op=s;
}
else if(s=='-'){
cin>>num;
shu[i].op=s;
shu[i].num=num;
}
}
for(int i=2*n;i>=1;i--)
{
if(shu[i].op=='-'&&(!st.empty()&&st.top()>shu[i].num||st.empty())){
st.push(shu[i].num);
}
else if(shu[i].op=='+'){
if(!st.empty())
{
pre[++cnt]=st.top();
st.pop();
}
}
else {
cout<<"NO"<<endl;
return 0;
}
}
if(!st.empty()){
cout<<"NO"<<endl;
return 0;
}
cout<<"YES"<<endl;
for(int i=cnt;i>=1;i--){
cout<<pre[i]<<" ";
}
cout<<endl;
return 0;
}
E
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int T;
ll a,b,c,d;
int main(){
cin>>T;
while(T--){
cin>>a>>b>>c>>d;
if(a>b*c){
cout<<-1<<endl;
continue;
}
ll k=a/(b*d);
printf("%lld\n",a*(k+1)-(1+k)*k/2*b*d);
}
}