ICPC Asia Nanning 2017
Posted oneman233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ICPC Asia Nanning 2017相关的知识,希望对你有一定的参考价值。
比赛地址:https://www.jisuanke.com/contest/3107?view=challenges
A、签到,大概就是输出几个字符串
#include <bits/stdc++.h> using namespace std; int t,n; int main() scanf("%d",&t); while(t--) scanf("%d",&n); for(int i=1;i<=n;++i) printf("Abiyoyo, Abiyoyo.\n"); printf("Abiyoyo, yo yoyo yo yoyo.\n"); printf("Abiyoyo, yo yoyo yo yoyo.\n"); return 0;
F、签到2.0,上大数板子搞一下,猜了个结论:答案为最大的k使得2^k<=n
后来跟rhy讨论了下,每轮淘汰掉第1、3、5、7、9个人的话,相当于不断把n除以2,最后留下的必定是一个2^k
#include <bits/stdc++.h> #define MAXN 9999 #define MAXSIZE 1000 #define DLEN 4 using namespace std; class BigNum private: int a[210]; int len; public: BigNum() len = 1;memset(a,0,sizeof(a)); void XD(); BigNum(const int); BigNum(const long long int); BigNum(const char*); BigNum(const string &); BigNum(const BigNum &); BigNum &operator = (const BigNum &); BigNum &operator = (const int &); BigNum &operator = (const long long int &); friend istream& operator >> (istream&, BigNum&); friend ostream& operator << (ostream&, BigNum&); template<typename T> BigNum operator << (const T &) const; template<typename T> BigNum operator >> (const T &) const; BigNum operator + (const BigNum &) const; BigNum operator - (const BigNum &) const; BigNum operator * (const BigNum &) const; bool operator > (const BigNum& b)const; bool operator < (const BigNum& b) const; bool operator == (const BigNum& b) const; template<typename T> BigNum operator / (const T &) const; template<typename T> BigNum operator ^ (const T &) const; template<typename T> T operator % (const T &) const; template<typename T> BigNum operator + (const T& b) const BigNum t = b; t = *this + t; return t; template<typename T> BigNum operator - (const T& b) const BigNum t = b; t = *this - t; return t; template<typename T> BigNum operator * (const T& b) const BigNum t = b; t = (*this) * t; return t; template<typename T> bool operator < (const T& b) const BigNum t = b; return ((*this) < t); template<typename T> bool operator > (const T& b) const BigNum t = b; return ((*this) > t); template<typename T> bool operator == (const T& b) const BigNum t = b; return ((*this) == t); bool operator <= (const BigNum& b) const return (*this) < b || (*this) == b; bool operator >= (const BigNum& b) const return (*this) > b || (*this) == b; bool operator != (const BigNum& b) const return !((*this) == b); template<typename T> bool operator >= (const T& b) const BigNum t = b; return !((*this) < t); template<typename T> bool operator <= (const T& b) const BigNum t = b; return !((*this) > t); template<typename T> bool operator != (const T& b) const BigNum t = b; return !((*this) == t); BigNum& operator += (const BigNum& b) *this = *this + b; return *this; BigNum& operator -= (const BigNum& b) *this = *this - b; return *this; BigNum& operator *= (const BigNum& b) *this = *this * b; return *this; template<typename T> BigNum& operator /= (const T& b) *this = *this/b; return *this; template<typename T> BigNum& operator %= (const T& b) *this = *this%b; return *this; template<typename T> BigNum& operator += (const T& b) *this = *this+b; return *this; template<typename T> BigNum& operator -= (const T& b) *this = *this-b; return *this; template<typename T> BigNum& operator *= (const T& b) *this = *this*b; return *this; template<typename T> BigNum& operator ^= (const T& b) *this = *this^b; return *this; BigNum operator ++ (int) BigNum t = *this; *this += 1; return t; BigNum operator -- (int) BigNum t = *this; *this -= 1; return t; BigNum& operator -- () *this -= 1; return *this; BigNum& operator ++ () *this += 1; return *this; template<typename T> BigNum& operator <<= (const T& b) *this = *this << b; return *this; template<typename T> BigNum& operator >>= (const T& b) *this = *this >> b; return *this; template<typename T> BigNum friend operator + (const T& a, const BigNum& b) BigNum t = a; t = t + a; return t; template<typename T> BigNum friend operator - (const T& a, const BigNum& b) BigNum t = a; t = t - b; return t; template<typename T> BigNum friend operator * (const T& a, const BigNum& b) BigNum t = a; t = t * b; return t; template<typename T> friend bool operator < (const T& a, const BigNum& b) return b > a; template<typename T> friend bool operator > (const T& a, const BigNum& b) return b < a; template<typename T> friend bool operator <= (const T& a, const BigNum& b) return b >= a; template<typename T> friend bool operator >= (const T& a, const BigNum& b) return b <= a; template<typename T> friend bool operator == (const T& a, const BigNum& b) return b == a; template<typename T> friend bool operator != (const T& a, const BigNum& b) return b != a; void print(); int Size(); int the_first(); int the_last(); int to_int(); long long int to_long(); string to_String(); ; BigNum::BigNum(const int b) int c,d = b; len = 0; memset(a,0,sizeof(a)); while(d > MAXN) c = d - (d / (MAXN+1)) * (MAXN+1); d = d / (MAXN+1); a[len++] = c; a[len++] = d; BigNum::BigNum(const long long int b) long long int c,d = b; len = 0; memset(a,0,sizeof(a)); while(d > MAXN) c = d - (d / (MAXN+1)) * (MAXN+1); d = d / (MAXN+1); a[len++] = c; a[len++] = d; BigNum::BigNum(const string& s) int t,k,index,l,i; memset(a,0,sizeof(a)); l = s.size(); len = l/DLEN; if(l%DLEN) len++; index = 0; for(i = l-1; i >=0 ;i -= DLEN) t = 0; k = i-DLEN+1; if(k < 0) k = 0; for(int j = k; j <= i; j++) t = t*10 + s[j]-‘0‘; a[index++] = t; BigNum::BigNum(const char* s) int t,k,index,l,i; memset(a,0,sizeof(a)); l = strlen(s); len = l/DLEN; if(l%DLEN) len++; index = 0; for(i = l-1; i >= 0; i -= DLEN) t = 0; k = i - DLEN + 1; if(k < 0) k = 0; for(int j = k; j <= i; j++) t = t*10 + s[j] - ‘0‘; a[index++] = t; BigNum::BigNum(const BigNum & b) : len(b.len) memset(a,0,sizeof(a)); for(int i = 0 ; i < len ; i++) a[i] = b.a[i]; BigNum & BigNum::operator = (const BigNum& n) len = n.len; memset(a,0,sizeof(a)); for(int i = 0 ; i < len ; i++) a[i] = n.a[i]; return *this; BigNum & BigNum::operator = (const int& num) BigNum t(num); *this = t; return *this; BigNum & BigNum::operator = (const long long int& num) BigNum t(num); *this = t; return *this; istream& operator >> (istream & in, BigNum & b) char ch[MAXSIZE*4]; int i = -1; in>>ch; int l = strlen(ch); int cnt = 0, sum = 0; for(i = l-1; i >= 0; ) sum = 0; int t = 1; for(int j = 0; j < 4 && i >= 0; j++,i--,t *= 10) sum += (ch[i]-‘0‘)*t; b.a[cnt] = sum; cnt++; b.len = cnt++; return in; ostream& operator << (ostream& out, BigNum& b) int i; cout << b.a[b.len - 1]; for(i = b.len - 2 ; i >= 0 ; i--) cout.width(DLEN); cout.fill(‘0‘); cout << b.a[i]; return out; template<typename T> BigNum BigNum::operator << (const T& b) const T temp = 1; for(int i = 0; i < b; i++) temp *= 2; BigNum t = (*this) * temp; return t; template<typename T> BigNum BigNum::operator >> (const T& b) const T temp = 1; for(int i = 0; i < b; i++) temp *= 2; BigNum t = (*this) / temp; return t; BigNum BigNum::operator + (const BigNum& b) const BigNum t(*this); int i,big; big = b.len > len ? b.len : len; for(i = 0 ; i < big ; i++) t.a[i] += b.a[i]; if(t.a[i] > MAXN) t.a[i + 1]++; t.a[i] -=MAXN+1; if(t.a[big] != 0) t.len = big + 1; else t.len = big; return t; BigNum BigNum::operator - (const BigNum& b) const int i,j,big; bool flag; BigNum t1,t2; if(*this>b) t1 = *this; t2 = b; flag = 0; else t1 = b; t2 = *this; flag = 1; big = t1.len; for(i = 0 ; i < big ; i++) if(t1.a[i] < t2.a[i]) j = i + 1; while(t1.a[j] == 0) j++; t1.a[j--]--; while(j > i) t1.a[j--] += MAXN; t1.a[i] += MAXN + 1 - t2.a[i]; else t1.a[i] -= t2.a[i]; t1.len = big; while(t1.a[t1.len - 1] == 0 && t1.len > 1) t1.len--; big--; if(flag) t1.a[big-1] = 0-t1.a[big-1]; return t1; BigNum BigNum::operator * (const BigNum& b) const BigNum ret; int i,j,up; int temp,temp1; for(i = 0 ; i < len ; i++) up = 0; for(j = 0 ; j < b.len ; j++) temp = a[i] * b.a[j] + ret.a[i + j] + up; if(temp > MAXN) temp1 = temp - temp / (MAXN + 1) * (MAXN + 1); up = temp / (MAXN + 1); ret.a[i + j] = temp1; else up = 0; ret.a[i + j] = temp; if(up != 0) ret.a[i + j] = up; ret.len = i + j; while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--; return ret; template<typename T> BigNum BigNum::operator / (const T& b) const BigNum ret; T i,down = 0; for(i = len - 1 ; i >= 0 ; i--) ret.a[i] = (a[i] + down * (MAXN + 1)) / b; down = a[i] + down * (MAXN + 1) - ret.a[i] * b; ret.len = len; while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--; return ret; template<typename T> T BigNum::operator % (const T& b) const T i,d=0; for (i = len-1; i>=0; i--) d = ((d * (MAXN+1))% b + a[i])% b; return d; template<typename T> BigNum BigNum::operator^(const T& n) const BigNum t,ret(1); int i; if(n < 0) return 0; if(n == 0) return 1; if(n == 1) return *this; int m = n; while(m > 1) t =* this; for(i = 1; (i<<1) <= m;i <<= 1) t = t*t; m-=i; ret=ret*t; if(m == 1) ret = ret * (*this); return ret; bool BigNum::operator > (const BigNum& b) const int tot; if(len > b.len) return true; else if(len == b.len) tot = len - 1; while(a[tot] == b.a[tot] && tot >= 0) tot--; if(tot >= 0 && a[tot] > b.a[tot]) return true; else return false; else return false; bool BigNum::operator < (const BigNum& b) const int tot; if(len > b.len) return false; else if(len == b.len) tot = len - 1; while(a[tot] == b.a[tot] && tot >= 0) tot--; if(tot >= 0 && a[tot] > b.a[tot]) return false; else return true;// else return true; bool BigNum::operator == (const BigNum& b) const int tot = len-1; if(len != b.len) return false; while(a[tot] == b.a[tot] && tot >= 0) tot--; if(tot < 0) return true; return false; void BigNum::print() int i; cout << a[len - 1]; for(i = len-2; i >= 0; i--) cout.width(DLEN); cout.fill(‘0‘); cout << a[i]; cout << endl; int BigNum::Size() int t = a[len-1],cnt = 0; while(t) t /= 10; cnt++; cnt += (len-1)*4; return cnt; int BigNum::the_first() int t = a[len-1]; while(t > 10) t /= 10; return t; int BigNum::the_last() int t = a[0]; return t%10; int BigNum::to_int() int i,num; num = a[len-1]; for(i = len-2; i >= 0; i--) num = num*(MAXN+1) + a[i]; return num; long long int BigNum::to_long() int i; long long int num; num = a[len-1]; for(i = len-2; i >= 0; i--) num = num*(MAXN+1) + a[i]; return num; int t; BigNum in,out; int main() cin>>t; while(t--) cin>>in; out=1; while(out<=in) out*=2; out/=2; out.print(); return 0;
L、签到题3.0,又上大数板子搞一搞,打了个表看的规律a[i]=6*a[i-1]-a[i-2]+2,大概打到300左右答案就超过数据范围了,之后直接二分查询就完事
#include <bits/stdc++.h> #define MAXN 9999 #define MAXSIZE 1000 #define DLEN 4 using namespace std; class BigNum private: int a[210]; int len; public: BigNum() len = 1;memset(a,0,sizeof(a)); void XD(); BigNum(const int); BigNum(const long long int); BigNum(const char*); BigNum(const string &); BigNum(const BigNum &); BigNum &operator = (const BigNum &); BigNum &operator = (const int &); BigNum &operator = (const long long int &); friend istream& operator >> (istream&, BigNum&); friend ostream& operator << (ostream&, BigNum&); template<typename T> BigNum operator << (const T &) const; template<typename T> BigNum operator >> (const T &) const; BigNum operator + (const BigNum &) const; BigNum operator - (const BigNum &) const; BigNum operator * (const BigNum &) const; bool operator > (const BigNum& b)const; bool operator < (const BigNum& b) const; bool operator == (const BigNum& b) const; template<typename T> BigNum operator / (const T &) const; template<typename T> BigNum operator ^ (const T &) const; template<typename T> T operator % (const T &) const; template<typename T> BigNum operator + (const T& b) const BigNum t = b; t = *this + t; return t; template<typename T> BigNum operator - (const T& b) const BigNum t = b; t = *this - t; return t; template<typename T> BigNum operator * (const T& b) const BigNum t = b; t = (*this) * t; return t; template<typename T> bool operator < (const T& b) const BigNum t = b; return ((*this) < t); template<typename T> bool operator > (const T& b) const BigNum t = b; return ((*this) > t); template<typename T> bool operator == (const T& b) const BigNum t = b; return ((*this) == t); bool operator <= (const BigNum& b) const return (*this) < b || (*this) == b; bool operator >= (const BigNum& b) const return (*this) > b || (*this) == b; bool operator != (const BigNum& b) const return !((*this) == b); template<typename T> bool operator >= (const T& b) const BigNum t = b; return !((*this) < t); template<typename T> bool operator <= (const T& b) const BigNum t = b; return !((*this) > t); template<typename T> bool operator != (const T& b) const BigNum t = b; return !((*this) == t); BigNum& operator += (const BigNum& b) *this = *this + b; return *this; BigNum& operator -= (const BigNum& b) *this = *this - b; return *this; BigNum& operator *= (const BigNum& b) *this = *this * b; return *this; template<typename T> BigNum& operator /= (const T& b) *this = *this/b; return *this; template<typename T> BigNum& operator %= (const T& b) *this = *this%b; return *this; template<typename T> BigNum& operator += (const T& b) *this = *this+b; return *this; template<typename T> BigNum& operator -= (const T& b) *this = *this-b; return *this; template<typename T> BigNum& operator *= (const T& b) *this = *this*b; return *this; template<typename T> BigNum& operator ^= (const T& b) *this = *this^b; return *this; BigNum operator ++ (int) BigNum t = *this; *this += 1; return t; BigNum operator -- (int) BigNum t = *this; *this -= 1; return t; BigNum& operator -- () *this -= 1; return *this; BigNum& operator ++ () *this += 1; return *this; template<typename T> BigNum& operator <<= (const T& b) *this = *this << b; return *this; template<typename T> BigNum& operator >>= (const T& b) *this = *this >> b; return *this; template<typename T> BigNum friend operator + (const T& a, const BigNum& b) BigNum t = a; t = t + a; return t; template<typename T> BigNum friend operator - (const T& a, const BigNum& b) BigNum t = a; t = t - b; return t; template<typename T> BigNum friend operator * (const T& a, const BigNum& b) BigNum t = a; t = t * b; return t; template<typename T> friend bool operator < (const T& a, const BigNum& b) return b > a; template<typename T> friend bool operator > (const T& a, const BigNum& b) return b < a; template<typename T> friend bool operator <= (const T& a, const BigNum& b) return b >= a; template<typename T> friend bool operator >= (const T& a, const BigNum& b) return b <= a; template<typename T> friend bool operator == (const T& a, const BigNum& b) return b == a; template<typename T> friend bool operator != (const T& a, const BigNum& b) return b != a; void print(); int Size(); int the_first(); int the_last(); int to_int(); long long int to_long(); string to_String(); ; BigNum::BigNum(const int b) int c,d = b; len = 0; memset(a,0,sizeof(a)); while(d > MAXN) c = d - (d / (MAXN+1)) * (MAXN+1); d = d / (MAXN+1); a[len++] = c; a[len++] = d; BigNum::BigNum(const long long int b) long long int c,d = b; len = 0; memset(a,0,sizeof(a)); while(d > MAXN) c = d - (d / (MAXN+1)) * (MAXN+1); d = d / (MAXN+1); a[len++] = c; a[len++] = d; BigNum::BigNum(const string& s) int t,k,index,l,i; memset(a,0,sizeof(a)); l = s.size(); len = l/DLEN; if(l%DLEN) len++; index = 0; for(i = l-1; i >=0 ;i -= DLEN) t = 0; k = i-DLEN+1; if(k < 0) k = 0; for(int j = k; j <= i; j++) t = t*10 + s[j]-‘0‘; a[index++] = t; BigNum::BigNum(const char* s) int t,k,index,l,i; memset(a,0,sizeof(a)); l = strlen(s); len = l/DLEN; if(l%DLEN) len++; index = 0; for(i = l-1; i >= 0; i -= DLEN) t = 0; k = i - DLEN + 1; if(k < 0) k = 0; for(int j = k; j <= i; j++) t = t*10 + s[j] - ‘0‘; a[index++] = t; BigNum::BigNum(const BigNum & b) : len(b.len) memset(a,0,sizeof(a)); for(int i = 0 ; i < len ; i++) a[i] = b.a[i]; BigNum & BigNum::operator = (const BigNum& n) len = n.len; memset(a,0,sizeof(a)); for(int i = 0 ; i < len ; i++) a[i] = n.a[i]; return *this; BigNum & BigNum::operator = (const int& num) BigNum t(num); *this = t; return *this; BigNum & BigNum::operator = (const long long int& num) BigNum t(num); *this = t; return *this; istream& operator >> (istream & in, BigNum & b) char ch[MAXSIZE*4]; int i = -1; in>>ch; int l = strlen(ch); int cnt = 0, sum = 0; for(i = l-1; i >= 0; ) sum = 0; int t = 1; for(int j = 0; j < 4 && i >= 0; j++,i--,t *= 10) sum += (ch[i]-‘0‘)*t; b.a[cnt] = sum; cnt++; b.len = cnt++; return in; ostream& operator << (ostream& out, BigNum& b) int i; cout << b.a[b.len - 1]; for(i = b.len - 2 ; i >= 0 ; i--) cout.width(DLEN); cout.fill(‘0‘); cout << b.a[i]; return out; template<typename T> BigNum BigNum::operator << (const T& b) const T temp = 1; for(int i = 0; i < b; i++) temp *= 2; BigNum t = (*this) * temp; return t; template<typename T> BigNum BigNum::operator >> (const T& b) const T temp = 1; for(int i = 0; i < b; i++) temp *= 2; BigNum t = (*this) / temp; return t; BigNum BigNum::operator + (const BigNum& b) const BigNum t(*this); int i,big; big = b.len > len ? b.len : len; for(i = 0 ; i < big ; i++) t.a[i] += b.a[i]; if(t.a[i] > MAXN) t.a[i + 1]++; t.a[i] -=MAXN+1; if(t.a[big] != 0) t.len = big + 1; else t.len = big; return t; BigNum BigNum::operator - (const BigNum& b) const int i,j,big; bool flag; BigNum t1,t2; if(*this>b) t1 = *this; t2 = b; flag = 0; else t1 = b; t2 = *this; flag = 1; big = t1.len; for(i = 0 ; i < big ; i++) if(t1.a[i] < t2.a[i]) j = i + 1; while(t1.a[j] == 0) j++; t1.a[j--]--; while(j > i) t1.a[j--] += MAXN; t1.a[i] += MAXN + 1 - t2.a[i]; else t1.a[i] -= t2.a[i]; t1.len = big; while(t1.a[t1.len - 1] == 0 && t1.len > 1) t1.len--; big--; if(flag) t1.a[big-1] = 0-t1.a[big-1]; return t1; BigNum BigNum::operator * (const BigNum& b) const BigNum ret; int i,j,up; int temp,temp1; for(i = 0 ; i < len ; i++) up = 0; for(j = 0 ; j < b.len ; j++) temp = a[i] * b.a[j] + ret.a[i + j] + up; if(temp > MAXN) temp1 = temp - temp / (MAXN + 1) * (MAXN + 1); up = temp / (MAXN + 1); ret.a[i + j] = temp1; else up = 0; ret.a[i + j] = temp; if(up != 0) ret.a[i + j] = up; ret.len = i + j; while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--; return ret; template<typename T> BigNum BigNum::operator / (const T& b) const BigNum ret; T i,down = 0; for(i = len - 1 ; i >= 0 ; i--) ret.a[i] = (a[i] + down * (MAXN + 1)) / b; down = a[i] + down * (MAXN + 1) - ret.a[i] * b; ret.len = len; while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--; return ret; template<typename T> T BigNum::operator % (const T& b) const T i,d=0; for (i = len-1; i>=0; i--) d = ((d * (MAXN+1))% b + a[i])% b; return d; template<typename T> BigNum BigNum::operator^(const T& n) const BigNum t,ret(1); int i; if(n < 0) return 0; if(n == 0) return 1; if(n == 1) return *this; int m = n; while(m > 1) t =* this; for(i = 1; (i<<1) <= m;i <<= 1) t = t*t; m-=i; ret=ret*t; if(m == 1) ret = ret * (*this); return ret; bool BigNum::operator > (const BigNum& b) const int tot; if(len > b.len) return true; else if(len == b.len) tot = len - 1; while(a[tot] == b.a[tot] && tot >= 0) tot--; if(tot >= 0 && a[tot] > b.a[tot]) return true; else return false; else return false; bool BigNum::operator < (const BigNum& b) const int tot; if(len > b.len) return false; else if(len == b.len) tot = len - 1; while(a[tot] == b.a[tot] && tot >= 0) tot--; if(tot >= 0 && a[tot] > b.a[tot]) return false; else return true;// else return true; bool BigNum::operator == (const BigNum& b) const int tot = len-1; if(len != b.len) return false; while(a[tot] == b.a[tot] && tot >= 0) tot--; if(tot < 0) return true; return false; void BigNum::print() int i; cout << a[len - 1]; for(i = len-2; i >= 0; i--) cout.width(DLEN); cout.fill(‘0‘); cout << a[i]; cout << endl; int BigNum::Size() int t = a[len-1],cnt = 0; while(t) t /= 10; cnt++; cnt += (len-1)*4; return cnt; int BigNum::the_first() int t = a[len-1]; while(t > 10) t /= 10; return t; int BigNum::the_last() int t = a[0]; return t%10; int BigNum::to_int() int i,num; num = a[len-1]; for(i = len-2; i >= 0; i--) num = num*(MAXN+1) + a[i]; return num; long long int BigNum::to_long() int i; long long int num; num = a[len-1]; for(i = len-2; i >= 0; i--) num = num*(MAXN+1) + a[i]; return num; int t; BigNum a,ans[305]; int main() ans[0]=0; ans[1]=3; for(int i=2;i<=300;++i) ans[i]=6*ans[i-1]-ans[i-2]+2; cin>>t; while(t--) cin>>a; int p=lower_bound(ans+1,ans+1+300,a)-ans; ans[p].print(); return 0;
J、SB思维题,细节巨多,想半天没整明白,问了ly才搞过
大意是给你一个2*n的矩阵,问你能不能重新安排数字的顺序,使得任意两个相邻的数字和都不是3的倍数。
先按数字对3取余的余数把数字分成0,1,2三类,显然0和0、1和2不能摆在一起,那么不妨就这样反着考虑,什么情况下会输出no
感性地说,如果0太多,必定会有两个0相邻,而0太少则会导致1和2相邻
明确一点,摆成下面这两种形式是绝对没问题的:
1 1 1 1
1 1 1 1
和
2 2 2 2
2 2 2 2
那么剩下的问题就成了对0的处理。
如果0超过n个,不管你如何交错着放,一定会有0和0相邻,输出no
如果0只有一个,并且1和2的个数都不为0,不管你怎么分割,1和2必然相邻,因为把1和2分割开来至少需要两个0
如果0有两个,要考虑一种特别的情况如下:
1 0 2
0 1 2
这种情况下不论你如何安排都不能满足条件。
为什么会导致这种情况呢?上面说了把1和2分割开来至少需要两个0,这是有条件的:
如下图(星号代表未知位置):
1 * *
1 1 *
这时候用两个0把1和2隔开是完全没有问题的,因为这两个0不会相邻
但是下面这种情况就不一样了:
1 1 *
1 1 *
这时候用两个0就不能成功分割,因为这两个0必然相邻。
0大于等于3个的情况更好理解了,摆成下面这样就一定能成:
* 0 * 0
0 * 0 *
#include <bits/stdc++.h> using namespace std; int t,n,a,b; int cnt[3]; int main() scanf("%d",&t); while(t--) scanf("%d",&n); memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n;++i) scanf("%d",&a),cnt[a%3]++; for(int i=1;i<=n;++i) scanf("%d",&b),cnt[b%3]++; if(cnt[1]==2*n||cnt[2]==2*n)printf("YES\n");continue; if(cnt[0]>n)printf("NO\n");continue; if((cnt[0]<=1&&cnt[1]&&cnt[2])||(cnt[0]==2&&cnt[1]%2==0)) printf("NO\n"); else printf("YES\n"); return 0;
M、题意是求一个最大的点集合,使得点集合中的任意两个点都相互不可达。
感觉挺板子的,先floyd求传递闭包,再跑一遍二分图匹配把最小点覆盖算出来完事
#include <bits/stdc++.h> using namespace std; int t,n,m,u,v; int g[105][105]; bool vis[105]; int lk[105]; void floyd() for(int k=1;k<=n;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) g[i][j]=g[i][j]||(g[i][k]&&g[k][j]); bool dfs(int x) for(int i=1;i<=n;++i) if(g[x][i]==1&&!vis[i]) vis[i]=1; if(lk[i]==0||dfs(lk[i])) lk[i]=x; return 1; return 0; int main() scanf("%d",&t); while(t--) scanf("%d%d",&n,&m); memset(g,0,sizeof(g)); memset(lk,0,sizeof(lk)); for(int i=1;i<=m;++i) scanf("%d%d",&u,&v); g[u][v]=1; floyd(); // for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) cout<<g[i][j]<<" \n"[j==n]; int ans=0; for(int i=1;i<=n;++i) memset(vis,0,sizeof(vis)); if(dfs(i)) ++ans; printf("%d\n",n-ans); return 0;
以上是关于ICPC Asia Nanning 2017的主要内容,如果未能解决你的问题,请参考以下文章
ACM-ICPC 2017 Asia Urumqi(第八场)
2017-2018 ACM-ICPC, Asia Daejeon Regional Contest
2017 ICPC Asia Urumqi A.coins (概率DP + 期望)
2017 ACM/ICPC Asia Regional Shenyang Online