碎碎念
只想着快了 细节考虑不周,补题时一直就奇怪当时怎么就没这么想呢,
还有题意,老是会遗漏,英文水平不够呀
还有特判问题,错误想法前的特判,改掉其他地方后特判也要改呀
对于数学规律,算出的公式看自己的解决思路来化简
写写前五题吧 后俩有空补一下
A:给定01字符串s,长度n,x,y, 0=<x<y<n;可任意对某位取反,问使得s % 10^x == 10^y需进行的最小操作数。
嘛 简单 保证s的倒数y位都为0就ok了嘛 然后倒数的 x~y位之间也都是0就可以了
嗯 搞搞, 过了,开心
早上一看 hacked了
哇 看了下代码 判断倒数第x位的时候顺手判断了一下该位是否为1, 为0则操作数++,其实保证了s没有前导0 ,x<n,那倒数x位前肯定有1存在,x位是啥就无所谓了 呜
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<list> #include<set> using namespace std; typedef long long ll; typedef pair<ll,ll> p; typedef long double ld; #define mem(x) memset(x, 0, sizeof(x)) #define me(x) memset(x, -1, sizeof(x)) #define fo(i,n) for(ll i=0; i<n; i++) #define sc(x) scanf("%lf", &x) #define pr(x) printf("%lld ", x) #define pri(x) printf("%lld ", x) #define lowbit(x) x&-x const ll MOD = 1e9 +7; const ll N = 6e6 +5; ll a[N]; int main() { ll i, j, k, l=0; ll n, m, t; string s; ll x, y; cin>>n>>x>>y; cin>>s; ll co=0, ans=0; for(i=n-1; i>=0; i--) { if(co==y) { if(s[i]=='0') ans++; } else if(co==x) { //if(s[i]=='0') ans++; break; } else { if(s[i]=='1')ans++; } co++; } cout<<ans<<endl; return 0; }
B:看懂题意随便搞搞就出来了, 排个序,用l模拟每天要解决的问题数,>=l的安排进来,l再++,安排不进的就不管了 最后输出l-1
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<list> #include<set> using namespace std; typedef long long ll; typedef pair<ll,ll> p; typedef long double ld; #define mem(x) memset(x, 0, sizeof(x)) #define me(x) memset(x, -1, sizeof(x)) #define fo(i,n) for(ll i=0; i<n; i++) #define sc(x) scanf("%lf", &x) #define pr(x) printf("%lld ", x) #define pri(x) printf("%lld ", x) #define lowbit(x) x&-x const ll MOD = 1e9 +7; const ll N = 6e6 +5; ll a[N]; int main() { ll i, j, k, l=0; ll n, m, t; string s; ll x, y; cin>>n; for(i=0; i<n; i++) cin>>a[i]; sort(a,a+n); l=1; for(i=0; i<n; i++) { if(a[i]>=l) { l++; } } cout<<l-1<<endl; return 0; }
C:也是搞搞就行了 没啥要注意的呢
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<list> #include<set> using namespace std; typedef long long ll; typedef pair<ll,ll> p; typedef long double ld; #define mem(x) memset(x, 0, sizeof(x)) #define me(x) memset(x, -1, sizeof(x)) #define fo(i,n) for(ll i=0; i<n; i++) #define sc(x) scanf("%lf", &x) #define pr(x) printf("%lld ", x) #define pri(x) printf("%lld ", x) #define lowbit(x) x&-x const ll MOD = 1e9 +7; const ll N = 6e6 +5; ll a[N]; int main() { ll i, j, k, l=0; ll n, m, t; string s; cin>>n; cin>>s; ll co=0; for(i=0 ;i<s.size()-1; i+=2) { j=i+1; while(1) { if(j>=s.size()) break; if(s[i]!=s[j]) break; s.erase(j,1); co++; } } n=s.size(); if(n%2) s.erase(n-1,1), co++; cout<<co<<endl; if(s.size()) cout<<s<<endl; return 0; }
D:wa了好多发,最后发现问题出在特判上了 呜
题意:给定某数的除1和自身外的所有因子,找最小的该数,(不确保给定数据真的是某数的除1和自身外所有因子
简单,排个序,看因子个数奇偶性,若数据正确,a[i]*a[n-i+1] == a[i+1]*a[n-i] 一定成立,奇数个因子就会有一个平方项,一起判断就好
特判:如果个数为1的话输出该数的平方就好
若判断后无误,就检查一下该数(a[0]*a[n-1])的所有因子是否都在给定数据里,其实判断sqrt(a[0]*a[n-1])项就好了
然后 然后 自信满满地交了,wa
检查n遍,愣是漏了特判那里,给个数据9 直接输出81了但应该输出-1的,还有因子3 27,呜
改过就好了
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<list> #include<set> using namespace std; typedef long long ll; typedef pair<ll,ll> p; typedef long double ld; #define mem(x) memset(x, 0, sizeof(x)) #define me(x) memset(x, -1, sizeof(x)) #define fo(i,n) for(ll i=0; i<n; i++) #define sc(x) scanf("%lf", &x) #define pr(x) printf("%lld ", x) #define pri(x) printf("%lld ", x) #define lowbit(x) x&-x const ll MOD = 1e9 +7; const ll N = 6e6 +5; ll a[N]; map<ll,ll>mp; int main() { ll i, j, k, l=0; ll n, m, t; cin>>t; while(t--) { cin>>n; mp.clear(); mem(a); ll f=0; k=0; for(i=0; i<n; i++) cin>>a[i]; sort(a,a+n); mp[a[0]]=1; if(n==1) { k=a[0]*a[0]; l=sqrt(k); //cout<<l<<" "<<k<<endl; for(i=2; i<=l; i++) { //cout<<"aaa"<<mp[i]<<endl; if(k%i==0) { if(!mp[i]) {f=1;break;} } } if(f) { cout<<-1<<endl; continue; } cout<<k<<endl; continue; } k=a[0]*a[n-1]; mp[a[0]]=mp[a[n-1]]=1; l=a[0]; if(n%2) { for(i=1, j=n-2; i<n/2; i++, j--) { mp[a[i]]=1; if(a[i]*a[j]!=k) { f=1;break; } } l=a[i]; //cout<<"ooo"<<a[i]<<endl; mp[a[i]]=1; if(a[i]*a[i]!=k) f=1; if(f) { cout<<-1<<endl; continue; } } else { for(i=1, j=n-2; i<n/2; i++, j--) { mp[a[i]]=1; if(a[i]*a[j]!=k) { f=1;break; } } l=a[i-1]; if(f) { cout<<-1<<endl; continue; } } l=sqrt(k); //cout<<l<<" "<<k<<endl; for(i=2; i<=l; i++) { //cout<<"aaa"<<mp[i]<<endl; if(k%i==0) { if(!mp[i]) {f=1;break;} } } if(f) { cout<<-1<<endl; continue; } cout<<k<<endl; } return 0; }
E:
找找规律就好了呢
时间浪费在题意理解上了
题意:给定数组长度n 及数组 a, b, 可对数组b任意排序,使得sum (1=<L<=r<=n) (L=<i<=r) a[i]*b[i] 最小
很简单嘛 a的位置不动,只改b的位置,公式也好理解,当L=1~n时, r=L~n, 对所有r 取 i=L~r 求sum a[i]*b[i]
使sum最小的话,逆序匹配,a[ i ]最大匹配 b[ j ]最小,这样求和就最小啦
呵呵 刚开始理解错误,以为对每个L取值都可以重新排一次b数组,瞎搞了一下,发现测样例不对,一直调来调去都不对
开始输出数据,发现不对劲,
再看了两遍题目 好像b位置只能改一次 呜
最后计算公式 ( n - i + 1 ) * b [ i ] * a [ i ] * i
这样子 对a排序, 根据位置匹配就好了 wa
其实要想sum最小, b[i] 得和 a[i]*i*(n-i+1)匹配
i 和(n-i+1)都是固定值, 直接绑定 a [ i ] 就好了 a[ i ] * = i * ( n - i + 1 )
wa
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<list> #include<set> using namespace std; typedef long long ll; typedef pair<ll,ll> p; typedef long double ld; #define mem(x) memset(x, 0, sizeof(x)) #define me(x) memset(x, -1, sizeof(x)) #define fo(i,n) for(ll i=0; i<n; i++) #define sc(x) scanf("%lf", &x) #define pr(x) printf("%lld ", x) #define pri(x) printf("%lld ", x) #define lowbit(x) x&-x const ll MOD = 998244353; const ll N = 3e5 +5; struct node { ll x, id; }a[N]; ll b[N], c[N], d[N]; bool cmp(node a, node b) { if(a.x==b.x) return a.id<b.id; return a.x<b.x; } bool cmp1(node a, node b) { return a.id<b.id; } int main() { ll i, j, k, l=0; ll n, m, t; cin>>n; for(i=1; i<=n; i++) cin>>a[i].x, a[i].x*=i*(n-i+1),a[i].id=i, d[i]=a[i].x; for(i=1; i<=n; i++) cin>>b[i]; sort(a+1,a+n+1,cmp); sort(b+1,b+n+1); for(i=1, j=n; i<=n; i++, j--) { c[a[i].id]=b[j]; } //for(i=1; i<=n; i++) cout<<d[i]<<" ";cout<<endl; //for(i=1; i<=n; i++) cout<<c[i]<<" ";cout<<endl; //sort(a+1,a+n+1,cmp1); ll ans=0; for(i=1; i<=n; i++) { ans+=(d[i]%MOD*(c[i]%MOD))%MOD; ans%=MOD; //cout<<ans<<endl; } if(ans<0) ans+=MOD, ans%=MOD; cout<<ans<<endl; return 0; }