1002
题意
输入C++语句生成元组的语句, 转换成python对应的结果元组。
思路
设置一个标记数组,遍历字符数组,只保留 '(' ')' ',' 和数字 其它字符标志设置为0,输出时pass即可
代码
略
1003
题意
给定数组长度n,操作q次,输入数组a1-an, 接下来输入q次操作op,op为1则还要输入l,r, 表示在数组位置r后面,将l-r这一段复制一次, op为2则还要输入位置pos, 表示当前pos位置的数要参与异或运算,最后输出累计异或的结果。
思路
暴力模拟
代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
int t;
int n,op,q;
int a;
int l,r;
int pos;
int ans;
vector<int>x;
vector<int>b;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>q;
for(int i=0;i<n;i++){
cin>>a;
x.push_back(a);
}
while(q--){
cin>>op;
if(op==1){
cin>>l>>r;
auto it = x.begin();
int i;
for(it = x.begin(), i=1; it != x.end(); it++, i++)
if(i>=r && i<=l+r) x.insert(it+1, x[i-r+l-1]); //模拟在r之后复制l-r这一段
}
if(op==2){
cin>>pos;
ans = (ans) ^ (x[pos]); //计算异或和
}
}
cout<<ans<<endl; //输出结果
}
return 0;
}
1012
题意
见代码注释
思路
见代码注释
代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long ll;
int T;
ll n;
ll ans;
int f[1005];
// 题意:给定n 可以在每天存一次钱 每次存7元 或31元 或365元 问最少几天你可以恰好存到n元 如果无法恰好存到 输出-1
// 思路:先暴力打表看一下大概的结果 通过结果发现 存不到的情况只在n=365以内会出现
// 那么我们就可以把n从0 到 2*(365-1) 的结果先暴力计算出 存到f数组里
// 然后判断n 如果n<2*(365-1) 直接输出结果 否则 我们可以先拿出k = n/365-1个365来 那么剩下的nn=n%365 + 365 一定位于365-729之间
// 然而位于365-729之间的都已经计算出最小结果了 所以说在那个最小结果的基础上再拿k个365一定是n对应的最小结果
// 最终的n对应的最小结果 = 剩下的nn对应的最小结果(f[nn]) + 拿出了几个365 (k)
int main()
{
for(int i=1;i<=729;i++){ //暴力
int ans=INF;
for(int a=0;a<=729/7;a++)
for(int b=0;b<=729/31;b++)
for(int c=0;c<=729/365;c++)
if(7*a+31*b+365*c==i)
ans=min(ans,a+b+c);
if(ans == INF) f[i]=-1;
else f[i] = ans;
}
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
if(n<=729) cout<<f[n]<<endl; //如果n在2*365之内直接输出结果
else{ // 否则的话拿 n/365 -1 个 365 出来 作为结果一部分 剩下n%365+365要凑
ans=n/365-1;
n=n%365+365; //剩下的一定在 365到365+364之间 通过打表可以发现在这之间的n都有结果
cout<<f[n] + ans<<endl; //那么最小结果一定是那时的最小结果 + 再拿几个365
}
}
return 0;
}
1007
题意
输入区间, 表示的是时间, 问按照时间顺序排列,在时间区间出现重叠之前,有多少个区间是有效的,(重叠以后出现的区间都是无效的)。比如给定(1,4) (5,7) (6,9) (11,25)显然按照区间开始的时间顺序,前两个区间都不会重叠, 而第三个区间会和第二个重叠,所以有效区间之只有前两个。
思路
按照区间左端点排序, 观察下一区间的左端点的位置来判断是否重叠。
代码
略