地址:http://codeforces.com/contest/1342
题意:给出x,y和1操作2操作花费的费用a,b。使得x==y==0的最小花费。
解析:两种方式,x,y中较大的先-1,x==y后再一块-1到0。第二个方式就是,x先减到0,y再减到0。取个min就可以了。
#include<iostream> #include<cstring> #include<map> #include<cstdlib> #include<algorithm> #include<set> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--) { ll x,y,a,b; cin>>x>>y>>a>>b; if(x==y&&x==0) { cout<<"0"<<endl;continue; } if(x>y) { ll md=x-y; cout<<min(md*a+y*b,x*a+y*a)<<endl; } else if(x<y) { ll md=y-x; cout<<min(md*a+b*x,x*a+y*a)<<endl; } else if(x==y) { cout<<min(x*b,x*a+y*a)<<endl; } } }
题意:给出t串,求s串,t是s的子串(题中指s删除部分元素所得的子串)。保证s的循环周期最小,lens<=2*lent。
解析:这题有点奇怪。01竟然也输出01而且周期是2。。反正顺着题目意思写就行了,如果t串全相同,直接输出t串,否则遇见挨着相同的,中间就插一个与相邻不同的字符。
#include<iostream> #include<cstring> #include<map> #include<cstdlib> #include<algorithm> #include<set> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--) { char s[200]; cin>>s; int len=strlen(s); int ok=0; for(int i=1;i<len;i++) { if(s[i]!=s[i-1]) { ok=1;break; } } if(!ok) cout<<s<<endl; else { for(int i=0;i<len;i++) { cout<<s[i]; if(s[i]==s[i+1]) { if(s[i]=='0') cout<<"1"; else cout<<"0"; } } cout<<endl; } } }
题意:给出a,b,q。然后是q个l,r。求l,r内有多少个数满足%a%b!=%b%a。
解析:令x=a*b。x%a%b==x%b%a==0,所以可以先看<x的数。一个连续区间去模同一个数是有周期性的,模俩也不例外,把a*b看成一个数,那么连续区间%x的周期就是a*b。可以先把a*b以内满足题目条件的数找出来,用p[]前缀和打表,下次询问时直接相减就可以了。对于R,是:p[a*b-1]*(R/(a*b))+p[R%(a*b)]。因为打表只打到了a*b-1这里,R/(a*b)是算一下R里有几个周期,R%(a*b)不满一个周期的情况。L左边的同理,注意这里是p[L-1],因为求的是个闭区间[L,R]。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=50000; int p[maxn]; ll ac(ll nu,ll x) { return p[x-1]*(nu/x)+p[nu%x]; } int main() { int t; cin>>t; while(t--) { ll a,b,q; cin>>a>>b>>q; for(int i=1;i<a*b;i++) { p[i]=p[i-1]; if((i%a%b)!=(i%b%a)) { p[i]++; } // cout<<p[i]<<" "; } ll x=a*b; while(q--) { ll l,r; cin>>l>>r; cout<<ac(r,x)-ac(l-1,x)<<" "; } } }